Amazon S3 버킷에 조건부 쓰기 강제 적용
Amazon S3 버킷 정책을 사용하면 범용 버킷의 객체 업로드에 조건부 쓰기를 강제 적용할 수 있습니다.
버킷 정책은 Amazon S3 버킷과 그 내부의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다. 버킷 소유자만 정책을 버킷에 연결할 수 있습니다. 버킷 정책에 대한 자세한 내용은 Amazon S3의 버킷 정책를 참조하십시오.
조건 키 s3:if-match
또는 s3:if-none-match
를 선택적 Condition
요소 또는 Condition
블록을 사용하여 정책이 적용되는 시점을 지정할 수 있습니다. 멀티파트 업로드의 경우 CreateMultipartUpload
, UploadPart
및 UploadPartCopy
작업을 제외하려면 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
헤더를 포함하는 PutObject
및 CompleteMultipartUpload
요청만 사용하여 객체 업로드 허용
이 정책은 요청에 if-none-match
헤더가 포함된 경우 계정 111122223333, 사용자 Alice가 amzn-s3-demo-bucket1
버킷에 쓸 수 있도록 허용하여 객체 키가 버킷에 이미 존재하지 않도록 합니다. 지정된 버킷에 대한 모든 PutObject
및 CompleteMultipartUpload
요청이 성공하려면 if-none-match
헤더가 포함되어야 합니다. 이 헤더를 사용하면 객체 키가 버킷에 없는 경우에만 이 버킷에 쓸 수 있습니다.
참고
또한 이 정책은 CreateMultipartUpload
, UploadPart
및 UploadPartCopy
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
헤더를 포함하는 PutObject
및 CompleteMultipartUpload
요청만 사용하여 객체 업로드 허용
이 정책은 계정 111122223333, 사용자 Alice가 요청에 if-match
헤더가 포함된 경우에만 amzn-s3-demo-bucket1
에 쓸 수 있도록 허용합니다. 이 헤더는 S3에 있는 객체의 ETag 값을 WRITE
작업 중에 제공한 값과 비교합니다. ETag 값이 일치하지 않으면 작업이 실패합니다. 지정된 버킷에 대한 모든 PutObject
및 CompleteMultipartUpload
요청이 성공하려면 if-match
헤더가 포함되어야 합니다.
참고
또한 이 정책은 CreateMultipartUpload
, UploadPart
및 UploadPartCopy
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
, UploadPart
및 UploadPartCopy
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
/*" } ] }