Amazon S3 버킷에 조건부 쓰기 강제 적용 - Amazon Simple Storage Service

Amazon S3 버킷에 조건부 쓰기 강제 적용

Amazon S3 버킷 정책을 사용하면 범용 버킷의 객체 업로드에 조건부 쓰기를 강제 적용할 수 있습니다.

버킷 정책은 Amazon S3 버킷과 그 내부의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다. 버킷 소유자만 정책을 버킷에 연결할 수 있습니다. 버킷 정책에 대한 자세한 내용은 Amazon S3의 버킷 정책를 참조하십시오.

조건 키 s3:if-match 또는 s3:if-none-match를 선택적 Condition 요소 또는 Condition 블록을 사용하여 정책이 적용되는 시점을 지정할 수 있습니다. 멀티파트 업로드의 경우 CreateMultipartUpload, UploadPartUploadPartCopy 작업을 제외하려면 s3:ObjectCreationOperation 조건 키를 지정해야 합니다. 이러한 API는 조건부 헤더를 허용하지 않기 때문입니다. 버킷 정책에서 조건을 사용하는 것에 대한 자세한 내용은 조건 키를 사용한 버킷 정책 예시 섹션을 참조하세요.

참고

버킷 정책을 사용하여 조건부 쓰기를 강제 적용하는 경우 버킷 정책에 지정된 버킷 또는 접두사에 복사 작업을 수행할 수 없습니다. If-None-Match 또는 If-Match HTTP 헤더가 없는 CopyObject 요청은 403 Access Denied 오류와 함께 실패합니다. 이러한 HTTP 헤더가 포함된 CopyObject 요청은 501 Not Implemented 응답과 함께 실패합니다.

다음 예시에서는 버킷 정책에서 조건을 사용하여 클라이언트가 If-None-Match 또는 If-Match HTTP 헤더를 사용하도록 강제하는 방법을 보여줍니다.

예시 1: if-none-match 헤더를 포함하는 PutObjectCompleteMultipartUpload 요청만 사용하여 객체 업로드 허용

이 정책은 요청에 if-none-match 헤더가 포함된 경우 계정 111122223333, 사용자 Alice가 amzn-s3-demo-bucket1 버킷에 쓸 수 있도록 허용하여 객체 키가 버킷에 이미 존재하지 않도록 합니다. 지정된 버킷에 대한 모든 PutObjectCompleteMultipartUpload 요청이 성공하려면 if-none-match 헤더가 포함되어야 합니다. 이 헤더를 사용하면 객체 키가 버킷에 없는 경우에만 이 버킷에 쓸 수 있습니다.

참고

또한 이 정책은 CreateMultipartUpload, UploadPartUploadPartCopy API를 사용하여 멀티파트 업로드를 허용하는 s3:ObjectCreationOperation 조건 키를 설정합니다.

{ "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 요청만 사용하여 객체 업로드 허용

이 정책은 계정 111122223333, 사용자 Alice가 요청에 if-match 헤더가 포함된 경우에만 amzn-s3-demo-bucket1에 쓸 수 있도록 허용합니다. 이 헤더는 S3에 있는 객체의 ETag 값을 WRITE 작업 중에 제공한 값과 비교합니다. ETag 값이 일치하지 않으면 작업이 실패합니다. 지정된 버킷에 대한 모든 PutObjectCompleteMultipartUpload 요청이 성공하려면 if-match 헤더가 포함되어야 합니다.

참고

또한 이 정책은 CreateMultipartUpload, UploadPartUploadPartCopy API를 사용하여 멀티파트 업로드를 허용하는 s3:ObjectCreationOperation 조건 키를 설정합니다.

{ "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-match 또는 if-match 헤더가 포함된 객체 업로드 요청만 허용

이 정책은 요청에 if-none-match 또는 if-match 헤더가 포함된 경우 계정 111122223333, 사용자 Alice가 amzn-s3-demo-bucket1에 쓸 수 있도록 허용합니다. 이렇게 하면 키 이름이 버킷에 존재하지 않을 경우 Alice가 객체를 업로드할 수 있습니다. 또는 키 이름이 존재할 경우 객체 ETag가 PUT 요청에 제공된 ETag와 일치하면 Alice가 객체를 덮어쓸 수 있습니다.

참고

또한 이 정책은 CreateMultipartUpload, UploadPartUploadPartCopy API를 사용하여 멀티파트 업로드를 허용하는 s3:ObjectCreationOperation 조건 키를 설정합니다.

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