强制对 Amazon S3 存储桶实施有条件写入 - Amazon Simple Storage Service

强制对 Amazon S3 存储桶实施有条件写入

通过使用 Amazon S3 存储桶策略,可以对通用存储桶中的对象上传强制实施有条件写入。

存储桶策略是基于资源的策略,您可以使用该策略向 Amazon S3 存储桶及其中的对象授予访问权限。只有存储桶拥有者才能将策略与存储桶关联。有关存储桶策略的更多信息,请参阅 Amazon S3 的存储桶策略

您可以使用条件键 s3:if-matchs3:if-none-match 作为可选的 Condition 元素或 Condition 块来指定策略何时生效。对于分段上传,您必须指定 s3:ObjectCreationOperation 条件键以豁免 CreateMultipartUploadUploadPartUploadPartCopy 操作,因为这些 API 不接受有条件标头。有关在存储桶策略中使用条件的更多信息,请参阅使用条件键的存储桶策略示例

注意

如果您使用存储桶策略来强制实施有条件写入,则无法对在存储桶策略中指定的存储桶或前缀执行复制操作。不带 If-None-MatchIf-Match HTTP 标头的 CopyObject 请求失败并出现 403 Access Denied 错误。使用这些 HTTP 标头发出的 CopyObject 请求失败并导致 501 Not Implemented 响应。

以下示例说明如何使用存储桶策略中的条件来强制客户端使用 If-None-MatchIf-Match HTTP 标头。

示例 1:仅支持使用包含 if-none-match 标头的 PutObjectCompleteMultipartUpload 请求上传对象

如果请求包含 if-none-match 标头,则此策略支持账户 111122223333(用户 Alice)写入 amzn-s3-demo-bucket1 存储桶,从而确保存储桶中不存在对象键。针对指定存储桶的所有 PutObjectCompleteMultipartUpload 请求都必须包含 if-none-match 标头才能获得成功。使用此标头,仅当存储桶中不存在对象键时,客户才能写入该存储桶。

注意

该策略还设置了 s3:ObjectCreationOperation 条件键,以支持使用 CreateMultipartUploadUploadPartUploadPartCopy API 进行分段上传。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowConditionalPut", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Null": { "s3:if-none-match": "false" } } }, { "Sid": "AllowConditionalPutwithMPUs", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Bool": { "s3:ObjectCreationOperation": "false" } } } ] }

示例 2:仅支持使用包含 if-match 标头的 PutObjectCompleteMultipartUpload 请求上传对象

只有在请求包含 if-match 标头的情况下,此策略才支持账户 111122223333(用户 Alice)写入 amzn-s3-demo-bucket1。此标头将 S3 中对象的 ETag 值与您在 WRITE 操作期间提供的值进行比较。如果 ETag 值不匹配,则操作将失败。针对指定存储桶的所有 PutObjectCompleteMultipartUpload 请求都必须包含 if-match 标头才能获得成功。

注意

该策略还设置了 s3:ObjectCreationOperation 条件键,以支持使用 CreateMultipartUploadUploadPartUploadPartCopy API 进行分段上传。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObject", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", }, { "Sid": "BlockNonConditionalObjectCreation", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Null": { "s3:if-match": "true" }, "Bool": { "s3:ObjectCreationOperation": "true" } } }, { "Sid": "AllowGetObjectBecauseConditionalPutIfMatchETag", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*" } ] }

示例 3:仅支持包含 if-none-matchif-match 标头的对象上传请求

如果请求包含 if-none-matchif-match 标头,则此策略支持账户 111122223333(用户 Alice)写入 amzn-s3-demo-bucket1。这可让 Alice 在存储桶中不存在键名称的情况下上传对象,或者,如果键名称确实存在,当对象 ETag 与 PUT 请求中提供的 ETag 匹配时,Alice 可以覆盖该对象。

注意

该策略还设置了 s3:ObjectCreationOperation 条件键,以支持使用 CreateMultipartUploadUploadPartUploadPartCopy API 进行分段上传。

{ "Version": "2012-10-17", "Statement": [ { "Sid": " AllowConditionalPutifAbsent", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Null": { "s3:if-none-match": "false" } } }, { "Sid": "AllowConditionalPutIfMatchEtag", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Null": { "s3:if-match": "false" } } }, { "Sid": "AllowConditionalObjectCreation", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "Bool": { "s3:ObjectCreationOperation": "false" } } }, { "Sid": " AllowGetObjectBecauseConditionalPutIfMatchETag", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*" } ] }