Enforce conditional writes on Amazon S3 buckets - Amazon Simple Storage Service

Enforce conditional writes on Amazon S3 buckets

By using Amazon S3 bucket policies, you can enforce conditional writes for object uploads in your general purpose buckets.

A bucket policy is a resource-based policy that you can use to grant access permissions to your Amazon S3 bucket and the objects in it. Only the bucket owner can associate a policy with a bucket. For more information about bucket policies, see Bucket policies for Amazon S3.

You can use the condition keys s3:if-match or s3:if-none-match as the optional Condition element or Condition block to specify when a policy is in effect. For multipart uploads you must specify the s3:ObjectCreationOperation condition key to exempt the CreateMultipartUpload, UploadPart, and UploadPartCopy operations, as these APIs don't accept conditional headers. For more information about using conditions in bucket policies, see Bucket policy examples using condition keys.

Note

If you use a bucket policy to enforce conditional writes, you can't perform copy operations to the bucket or prefix specified in your bucket policy. CopyObject requests without an If-None-Match or If-Match HTTP header fail with a 403 Access Denied error. CopyObject requests made with those HTTP headers fail with a 501 Not Implemented response.

The following examples show how to use conditions in a bucket policy to force clients to use the If-None-Match or If-Match HTTP header.

Example 1: Only allow object uploads using PutObject and CompleteMultipartUpload requests that include the if-none-match header

This policy allows account 111122223333, user Alice to write to amzn-s3-demo-bucket1 only if the request includes the if-none-match header. All PutObject and CompleteMultipartUpload requests to the specified bucket must include the if-none-match header to succeed. Using this header, customers can write to this bucket only if the object key does not exist in the bucket.

Note

This policy also sets the s3:ObjectCreationOperation condition key which allows for multipart uploads using the CreateMultipartUpload, UploadPart, and UploadPartCopy APIs.

{ "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": "AllowConditionalPut-withMPUs", "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" } } } ] }

Example 2: Only allow object uploads using PutObject and CompleteMultipartUpload requests that include the if-match header

This policy allows account 111122223333, user Alice to write to amzn-s3-demo-bucket1 only if the request includes the if-match header. This header compares the ETag value of an object in S3 with one you provide during the WRITE operation. If the ETag values do not match, the operation will fail. All PutObject and CompleteMultipartUpload requests to the specified bucket must include the if-match header to succeed.

Note

This policy also sets the s3:ObjectCreationOperation condition key which allows for multipart uploads using the CreateMultipartUpload, UploadPart, and UploadPartCopy APIs.

{ "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/*" } ] }

Example 3: Only allow object upload requests that includes the if-none-match or if-match header

This policy allows account 111122223333, user Alice to write to amzn-s3-demo-bucket1 if the requests include the if-none-match or if-match header. This allows Alice to upload an object is the key name does not exists in the bucket, or if the key name does exist Alice can overwrite the object if the object ETag matches the ETag provided in the PUT request.

Note

This policy also sets the s3:ObjectCreationOperation condition key which allows for multipart uploads using the CreateMultipartUpload, UploadPart, and UploadPartCopy APIs.

{ "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/*" } ] }