

# 조건부 쓰기를 통해 객체 덮어쓰기를 방지하는 방법
<a name="conditional-writes"></a>

조건부 쓰기를 사용하면 `WRITE` 요청에 헤더를 더 추가하여 Amazon S3 작업에 사전 조건을 지정할 수 있습니다. 조건부로 객체를 작성하려면 HTTP `If-None-Match` 또는 `If-Match` 헤더를 추가합니다.

`If-None-Match` 헤더는 버킷에 이미 같은 키 이름을 가진 객체가 없는지 확인하여 기존 데이터를 덮어쓰지 않도록 방지합니다.

또는 객체를 쓰기 전에 `If-Match` 헤더를 추가하여 객체의 엔터티 태그(ETag)를 확인할 수 있습니다. 이 헤더를 사용하여 Amazon S3는 제공된 ETag 값을 S3에 있는 객체의 ETag 값과 비교합니다. 이때 ETag 값이 일치하지 않으면 작업이 실패합니다.

버킷 소유자는 버킷 정책을 사용하여 업로드된 객체에 조건부 쓰기를 강제 적용할 수 있습니다. 자세한 내용은 [Amazon S3 버킷에 조건부 쓰기 강제 적용](conditional-writes-enforce.md) 섹션을 참조하세요.

**참고**  
조건부 쓰기를 사용하려면 AWS Signature Version 4를 사용하여 요청에 서명해야 합니다.

**Topics**
+ [키 이름을 기반으로 객체 덮어쓰기를 방지하는 방법](#conditional-write-key-names)
+ [객체가 변경된 경우 덮어쓰기를 방지하는 방법](#conditional-write-etags)
+ [조건부 쓰기 동작](#conditional-error-response)
+ [조건부 쓰기 시나리오](#conditional-write-scenarios)
+ [Amazon S3 버킷에 조건부 쓰기 강제 적용](conditional-writes-enforce.md)

## 키 이름을 기반으로 객체 덮어쓰기를 방지하는 방법
<a name="conditional-write-key-names"></a>

HTTP `If-None-Match` 조건부 헤더를 사용하여 객체를 생성하거나 대상 버킷에 복사하기 전에 키 이름을 기반으로 지정된 버킷에 객체가 이미 존재하는지 확인할 수 있습니다.

HTTP `If-None-Match` 헤더가 포함된 조건부 쓰기는 `WRITE` 작업 중에 객체의 존재 여부를 확인합니다. 버킷에 동일한 키 이름이 있는 경우 작업이 실패합니다. HTTP `If-None-Match` 헤더가 없으면 버전이 지정되지 않았거나 버전 지정이 일시 중지된 버킷에 동일한 키 이름을 가진 객체를 업로드 또는 복사하면 해당 객체가 덮어쓰입니다. 키 이름 사용에 대한 자세한 내용은 [Amazon S3 객체 이름 지정](object-keys.md) 섹션을 참조하세요.

**참고**  
HTTP `If-None-Match` 헤더는 버전 버킷에 있는 객체의 현재 버전에만 적용됩니다.

HTTP `If-None-Match` 헤더가 포함된 조건부 쓰기를 수행하려면 `s3:PutObject` 권한이 있어야 합니다. 이를 통해 호출자는 버킷에 객체가 있는지 확인할 수 있습니다. `If-None-Match` 헤더에는 \$1(별표) 값이 필요합니다.

`If-None-Match` 헤더를 다음 API와 함께 사용할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

### AWS CLI를 사용한 조건부 입력
<a name="conditional-writes-putobject-CLI-key-names"></a>

다음 `put-object` 예시 명령은 키 이름이 `dir-1/my_images.tar.bz2`인 객체에 대해 조건부 쓰기를 수행하려고 시도합니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"       
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

### AWS CLI를 사용한 조건부 복사
<a name="conditional-writes-copyobject-CLI-key-names"></a>

다음 `copy-object` 예시 명령은 키 이름이 `dir-1/my_images.tar.bz2`인 객체에 대해 조건부 쓰기로 객체를 대상 버킷에 복사하려고 시도합니다.

```
aws s3api copy-object --copy-source amzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucket amzn-s3-demo-bucket2 --if-none-match "*"            
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

### AWS CLI를 사용한 조건부 멀티파트 업로드
<a name="conditional-writes-mpu-complete-CLI-key-names"></a>

다음 `complete-multipart-upload` 예제 명령은 키 이름이 `dir-1/my_images.tar.bz2`인 객체에 대해 조건부 쓰기로 멀티파트 업로드를 완료하려고 시도합니다. 이 예제에서 file:// 접두사는 tnis별 멀티파트 업로드를 위해 업로드된 모든 파트의 목록인 `mpustruct`라는 로컬 폴더의 파일에서 JSON 구조를 로드하는 데 사용됩니다.

```
aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --upload-id upload-id  --if-none-match "*"             
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

## 객체가 변경된 경우 덮어쓰기를 방지하는 방법
<a name="conditional-write-etags"></a>

객체의 ETag는 객체에 고유한 문자열이며 객체의 콘텐츠에 대한 변경 사항을 반영합니다. `If-Match` 헤더를 사용하여 Amazon S3 버킷에 있는 객체의 ETag 값을 `WRITE` 작업 중에 제공한 값과 비교할 수 있습니다. 이때 ETag 값이 일치하지 않으면 작업이 실패합니다. ETag에 대한 자세한 내용은 [Content-MD5 및 ETag를 사용하여 업로드된 객체 확인](checking-object-integrity-upload.md#checking-object-integrity-etag-and-md5) 섹션을 참조하세요.

HTTP `If-Match` 헤더가 포함된 조건부 쓰기를 수행하려면 `s3:PutObject` 및 `s3:GetObject` 권한이 있어야 합니다. 그러면 호출자가 ETag를 확인하고 버킷에 있는 객체의 상태를 확인할 수 있습니다. `If-Match` 헤더에는 ETag 값이 문자열로 필요합니다.

`If-Match` 헤더를 다음 API와 함께 사용할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

### AWS CLI를 사용한 조건부 입력
<a name="conditional-writes-putobject-CLI-etags"></a>

다음 `put-object` 예시 명령은 제공된 ETag 값 `6805f2cfc46c0f04559748bb039d69ae`를 사용해 조건부 쓰기를 수행하려고 시도합니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69ae"         
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

### AWS CLI를 사용한 조건부 복사
<a name="conditional-writes-copyobject-CLI-etags"></a>

다음 `copy-object` 예시 명령은 제공된 ETag 값 `6805f2cfc46c0f04559748bb039d69ae`를 사용해 조건부 쓰기를 수행하려고 시도합니다.

```
aws s3api copy-object --copy-source amzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucket amzn-s3-demo-bucket2 --if-match "6805f2cfc46c0f04559748bb039d69ae"             
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

### AWS CLI를 사용한 조건부 멀티파트 업로드
<a name="conditional-writes-mpu-complete-CLI-etags"></a>

다음 `complete-multipart-upload` 예제 명령은 제공된 ETag 값 `6805f2cfc46c0f04559748bb039d69ae`를 사용해 조건부 쓰기로 멀티파트 업로드를 완료하려고 시도합니다. 이 예제에서 file:// 접두사는 tnis별 멀티파트 업로드를 위해 업로드된 모든 파트의 목록인 `mpustruct`라는 로컬 폴더의 파일에서 JSON 구조를 로드하는 데 사용됩니다.

```
aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --upload-id upload-id --if-match "6805f2cfc46c0f04559748bb039d69ae"             
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

## 조건부 쓰기 동작
<a name="conditional-error-response"></a>

**`If-None-Match` 헤더가 포함된 조건부 쓰기 또는 복사**  
`If-None-Match` 헤더가 포함된 조건부 쓰기는 버킷의 기존 객체와 비교해 평가합니다. 버킷에 동일한 키 이름을 가진 기존 객체가 없는 경우 쓰기 작업이 성공하여 `200 OK` 응답이 반환됩니다. 기존 객체가 있는 경우 쓰기 작업이 실패하여 `412 Precondition Failed` 응답이 반환됩니다.  
버전 관리가 활성화된 버킷의 경우 이름이 같은 현재 객체 버전이 없거나 현재 객체 버전이 삭제 마커인 경우 쓰기 작업이 성공합니다. 그렇지 않으면 `412 Precondition Failed` 응답과 함께 쓰기 작업이 실패하게 됩니다.  
동일한 객체 이름에 대해 조건부 쓰기 또는 복사가 여러 번 발생하는 경우 가장 먼저 완료되는 쓰기 작업이 성공합니다. 그런 다음 Amazon S3에서 `412 Precondition Failed` 응답과 함께 후속 쓰기 작업이 실패합니다.  
요청이 동시에 발생하는 경우에도 객체에 대한 조건부 쓰기 작업이 완료되기 전에 객체에 대한 삭제 요청이 성공하면 `409 Conflict` 응답이 반환될 수 있습니다. `PutObject`와 함께 조건부 쓰기를 사용하는 경우 `409 Conflict` 오류가 발생한 후 업로드가 재시도될 수 있습니다. `CompleteMultipartUpload`를 사용하는 경우 `409 Conflict` 오류가 발생한 후 객체를 다시 업로드하려면 `CreateMultipartUpload`로 멀티파트 업로드를 다시 시작해야 합니다.

**`If-Match` 헤더가 포함된 조건부 쓰기 또는 복사**  
`If-Match` 헤더는 버킷의 기존 객체와 비교해 평가합니다. 버킷에 동일한 키 이름 및 일치하는 ETag를 가진 기존 객체가 있는 경우 쓰기 작업이 성공하여 `200 OK` 응답이 반환됩니다. ETag가 일치하지 않으면 `412 Precondition Failed` 응답과 함께 쓰기 작업이 실패합니다.  
동시 요청의 경우에도 `409 Conflict` 응답을 받을 수 있습니다.  
객체에 대한 조건부 쓰기 작업이 완료되기 전에 해당 객체에 대한 동시 삭제 요청이 성공하는 경우 객체 키가 더 이상 존재하지 않으므로 `404 Not Found` 응답이 반환됩니다. `404 Not Found` 응답을 받으면 객체를 다시 업로드해야 합니다.  
이름이 같은 현재 객체 버전이 없거나 현재 객체 버전이 삭제 마커인 경우 작업이 `404 Not Found` 오류와 함께 실패합니다.

## 조건부 쓰기 시나리오
<a name="conditional-write-scenarios"></a>

두 클라이언트가 같은 버킷에서 작업을 실행하는 다음 시나리오를 생각해 보세요.

**멀티파트 업로드 중 조건부 쓰기**  
진행 중인 멀티파트 업로드 요청은 아직 완전히 쓴 객체가 아니므로 조건부 쓰기는 진행 중인 멀티파트 업로드 요청을 고려하지 않습니다. 클라이언트 1이 멀티파트 업로드를 사용하여 객체를 업로드하는 다음 예를 살펴보세요. 멀티파트 업로드 중에 클라이언트 2는 조건부 쓰기 작업을 통해 동일한 객체를 성공적으로 쓸 수 있습니다. 이후 클라이언트 1이 조건부 쓰기를 사용하여 멀티파트 업로드를 완료하려고 하면 업로드가 실패합니다.

**참고**  
이 시나리오에서는 `If-None-Match` 및 `If-Match` 헤더 모두에 대해 `412 Precondition Failed` 응답이 반환됩니다.

![\[동일한 키 이름으로 항목을 쓰는 두 클라이언트의 예시입니다. 하나는 MPU용 UploadPart를 사용하고 다른 하나는 PutObject와 조건부 쓰기를 사용합니다. 이후에 시작되는 CompleteMultipartUpload 작업은 실패합니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/conwrite_put_mpu.png)


**멀티파트 업로드 중 동시 삭제**  
조건부 쓰기 요청이 완료되기 전에 삭제 요청이 성공하면 Amazon S3는 쓰기 작업에 대해 `409 Conflict` 또는 `404 Not Found` 응답을 반환합니다. 이전에 시작된 삭제 요청이 조건부 쓰기 작업보다 우선하기 때문입니다. 이 경우 새 멀티파트 업로드를 시작해야 합니다.

**참고**  
이 시나리오에서 `If-None-Match` 헤더에 대해서는 `409 Conflict` 응답이, `If-Match` 헤더에 대해서는 `404 Not Found` 응답이 반환됩니다.

![\[멀티파트 업로드를 사용하는 클라이언트와 MPU가 시작된 후 삭제 요청을 보내는 클라이언트 두 개의 예입니다. 조건부 쓰기가 시작되기 전에 삭제 요청이 완료됩니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/conwrite_delete_mpu.png)


**참고**  
스토리지 비용을 최소화하려면 `AbortIncompleteMultipartUpload` 작업을 사용하여 특정 기간이 지나면 불완전한 멀티파트 업로드를 삭제하는 수명 주기 규칙을 구성하는 것이 좋습니다. 불완전한 멀티파트 업로드를 삭제하기 위한 수명 주기 규칙을 만드는 방법과 관련하여 자세한 내용은 [불완전한 멀티파트 업로드를 삭제하도록 버킷 수명 주기 구성 설정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)을 참조하십시오.

# Amazon S3 버킷에 조건부 쓰기 강제 적용
<a name="conditional-writes-enforce"></a>

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

버킷 정책은 Amazon S3 버킷과 그 내부의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다. 버킷 소유자만 정책을 버킷에 연결할 수 있습니다. 버킷 정책에 대한 자세한 내용은 [Amazon S3의 버킷 정책](bucket-policies.md) 섹션을 참조하세요.

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

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

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

**Topics**
+ [예시 1: `if-none-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용](#conditional-writes-enforce-ex1)
+ [예시 2: `if-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용](#conditional-writes-enforce-ex2)
+ [예시 3: `if-none-match` 또는 `if-match` 헤더가 포함된 객체 업로드 요청만 허용](#conditional-writes-enforce-ex3)

## 예시 1: `if-none-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용
<a name="conditional-writes-enforce-ex1"></a>

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

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

------
#### [ JSON ]

****  

```
{
    "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` 요청만 사용하여 객체 업로드 허용
<a name="conditional-writes-enforce-ex2"></a>

이 정책은 계정 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` 헤더가 포함된 객체 업로드 요청만 허용
<a name="conditional-writes-enforce-ex3"></a>

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

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

------
#### [ JSON ]

****  

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

------