S3 버킷에서 조건부 쓰기 강제하기
S3 버킷에서 조건부 쓰기 강제하기
조건부 쓰기를 모든 사용자가 지키도록 강제하고 싶다면 어떻게 할까요. Amazon S3 버킷 정책을 사용하면 일반 용도 버킷(general purpose bucket)에서 업로드되는 객체에 조건부 쓰기를 강제할 수 있어요.
버킷 정책은 리소스 기반 정책으로, S3 버킷과 그 안의 객체에 대한 액세스 권한을 부여하는 데 사용할 수 있어요. 오직 버킷 소유자만 버킷에 정책을 연결할 수 있어요. 버킷 정책에 대한 자세한 내용은 Amazon S3용 버킷 정책을 참고하세요.
조건 키 s3:if-match 또는 s3:if-none-match를 선택적 Condition 요소(또는 Condition 블록)로 사용해 정책이 적용되는 시점을 지정할 수 있어요. 멀티파트 업로드에서는 CreateMultipartUpload, UploadPart, UploadPartCopy 작업을 면제하도록 s3:ObjectCreationOperation 조건 키를 지정해야 해요. 이 API들은 조건부 헤더를 받지 않기 때문이에요. 버킷 정책에서 조건을 사용하는 방법에 대한 자세한 내용은 조건 키를 사용한 버킷 정책 예시를 참고하세요.
참고
버킷 정책으로 조건부 쓰기를 강제하면, 버킷 정책에 지정된 버킷이나 접두사로의 복사 작업은 수행할 수 없어요.
If-None-Match또는If-MatchHTTP 헤더가 없는CopyObject요청은403 Access Denied오류로 실패하고, 그 HTTP 헤더를 사용한CopyObject요청은501 Not Implemented응답으로 실패해요.
다음 예시들은 클라이언트가 If-None-Match 또는 If-Match HTTP 헤더를 사용하도록 강제하는 버킷 정책에서 조건을 사용하는 방법을 보여줘요.
출처: 문서
본문
예시 1: if-none-match 헤더를 포함한 PutObject·CompleteMultipartUpload 요청만 허용
다음 정책은 계정 111122223333의 사용자 Alice가 if-none-match 헤더를 포함한 요청일 때만 amzn-s3-demo-bucket1 버킷에 쓸 수 있도록 해요. 이렇게 하면 객체 키가 버킷에 이미 존재하지 않는 경우에만 쓰기가 보장돼요. 지정된 버킷으로의 모든 PutObject와 CompleteMultipartUpload 요청은 성공하려면 if-none-match 헤더를 포함해야 해요. 이 헤더를 사용하면 고객은 객체 키가 버킷에 존재하지 않을 때만 이 버킷에 쓸 수 있어요.
참고
이 정책은
CreateMultipartUpload,UploadPart,UploadPartCopyAPI를 사용한 멀티파트 업로드를 허용하는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,UploadPartCopyAPI를 사용한 멀티파트 업로드를 허용하는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 헤더를 포함한 객체 업로드 요청만 허용
다음 정책은 계정 111122223333의 사용자 Alice가 if-none-match 또는 if-match 헤더를 포함한 요청일 때만 amzn-s3-demo-bucket1에 쓸 수 있도록 해요. 이 정책으로 Alice는 키 이름이 버킷에 존재하지 않을 때 객체를 업로드할 수 있고, 키 이름이 존재한다면 PUT 요청에 제공된 ETag와 객체 ETag가 일치할 때 덮어쓸 수 있어요.
참고
이 정책은
CreateMultipartUpload,UploadPart,UploadPartCopyAPI를 사용한 멀티파트 업로드를 허용하는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/*"
}
]
}