

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用條件式請求將先決條件新增至 S3 操作
<a name="conditional-requests"></a>

您可以使用條件式請求將先決條件新增至 S3 操作。若要使用條件式請求，請將額外的標頭新增至 Amazon S3 API 操作。此標頭會指定條件，如果不符合，則會導致 S3 操作失敗。

`GET`、`HEAD` 和 `COPY` 請求支援條件式讀取。您可以新增先決條件，根據物件的實體標籤 (ETag) 或上次修改日期來傳回或複製物件。這可限制對自指定日期以來已更新的物件執行 S3 操作。您也可以限制對特定 ETag 執行 S3 操作。這可確保您只傳回或複製特定物件版本。如需物件中繼資料的詳細資訊，請參閱「[使用物件中繼資料](UsingMetadata.md)」。

條件式寫入可確保在 `PUT` 操作期間，您的儲存貯體中不存在具有相同金鑰名稱的現有物件。這可防止覆寫具有相同金鑰名稱的現有物件。同樣地，您可以使用條件式寫入來檢查物件的 ETag 是否保持不變，再更新物件。這可防止在不知道其內容狀態的情況下，意外覆寫物件。您可以針對 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)、 [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) 或 [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 請求使用條件式寫入。如需金鑰名稱的詳細資訊，請參閱「[命名 Amazon S3 物件](object-keys.md)」。

條件式刪除會在刪除物件之前，評估物件是否存在或保持不變。您可以在一般用途和目錄儲存貯體中，使用 `DeleteObject` 或 `DeleteObjects` API 執行條件式刪除。如需條件式刪除的詳細資訊，請參閱 [如何執行條件式刪除](conditional-deletes.md)。條件式讀取、條件式寫入或條件式刪除，無需額外費用。您只需針對適用的請求以現有費率支付費用，包括失敗的請求。如需 Amazon S3 功能與定價的相關資訊，請參閱 [Amazon S3 定價](https://aws.amazon.com/s3/pricing)。

**Topics**
+ [如何使用條件式讀取根據中繼資料擷取或複製物件](conditional-reads.md)
+ [如何使用條件式寫入防止物件覆寫](conditional-writes.md)
+ [如何執行條件式刪除](conditional-deletes.md)

# 如何使用條件式讀取根據中繼資料擷取或複製物件
<a name="conditional-reads"></a>

透過條件式讀取，您可以將額外的標頭新增至讀取請求，以便將先決條件新增至 S3 操作。如果不符合這些先決條件，讀取請求將會失敗。

您可以在 `GET`、`HEAD` 或 `COPY` 請求上使用條件式讀取，只根據物件的中繼資料傳回物件。

當您上傳物件時，Amazon S3 會建立只能由 S3 修改的系統控制中繼資料。實體標籤 (ETags) 和上次修改日期都是系統控制中繼資料的範例。物件的 ETag 是代表物件特定版本的字串。上次修改日期是代表物件建立日期或上次修改日期 (以最近者為準) 的中繼資料。

透過條件式讀取，您可以根據物件的 ETag 或上次修改日期傳回物件。您可以在請求中指定 ETag 值，只有在 ETag 值相符時，才能傳回物件。這可確保您只傳回或複製特定版本的物件。您可以在讀取請求中指定上次修改日期值，只有在物件自您提供日期以來已經過修改時，才能傳回物件。

## 支援的 API
<a name="conditional-read-apis"></a>

下列 S3 API 支援使用條件式讀取：
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

您可以使用下列標頭，根據實體標籤 (ETag) 或上次修改日期傳回物件。如需 ETag 和上次修改日期等物件中繼資料的詳細資訊，請參閱[系統定義的物件中繼資料](UsingMetadata.md#SysMetadata)。

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)**  

+ `If-Match` — 只有在物件的 ETag 符合提供的 ETag 時，才能傳回物件。
+ `If-Modified-Since` — 只有在物件自指定時間以來已經過修改時，才能傳回物件。
+ `If-None-Match` — 只有在物件的 ETag 不符合提供的 ETag 時，才能傳回物件。
+ `If-Unmodified-Since` — 只有在物件自指定時間以來尚未經過修改時，才能傳回物件。

如需這些標頭、傳回的錯誤和 S3 在單一請求中處理多個條件式標頭之順序的詳細資訊，請參閱 Amazon Simple Storage Service API 參考中的[https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)。

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)**  

+ `If-Match` — 只有在物件的 ETag 符合提供的 ETag 時，才能傳回物件。
+ `If-Modified-Since` — 只有在物件自指定時間以來已經過修改時，才能傳回物件。
+ `If-None-Match` — 只有在物件的 ETag 不符合提供的 ETag 時，才能傳回物件。
+ `If-Unmodified-Since` — 只有在物件自指定時間以來尚未經過修改時，才能傳回物件。

如需這些標頭、傳回的錯誤和 S3 在單一請求中處理多個條件式標頭之順序的詳細資訊，請參閱 Amazon Simple Storage Service API 參考中的[https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)。

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)**  

+ `x-amz-copy-source-if-match` — 只有在來源物件的 ETag 符合提供的 ETag 時，才能複製來源物件。
+ `x-amz-copy-source-if-modified-since` — 只有在來源物件自指定時間以來已經過修改時，才能複製來源物件。
+ `x-amz-copy-source-if-none-match` — 只有在來源物件的 ETag 不符合提供的 ETag 時，才能複製來源物件。
+ `x-amz-copy-source-if-unmodified-since` — 只有在來源物件自指定時間以來尚未經過修改時，才能複製來源物件。
+ `If-Match` — 僅在物件的 ETag 符合提供的 ETag 時，才會複製物件。 `If-Match`預期 ETag 值為字串。
+ `If-None-Match` — 只有在物件的 ETag 與提供的 ETag 不相符時，才會複製物件。 `If-None-Match`預期 '\$1' （星號） 字元。

如需這些標頭、傳回的錯誤和 S3 在單一請求中處理多個條件式標頭之順序的詳細資訊，請參閱 Amazon Simple Storage Service API 參考中的[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)。

# 如何使用條件式寫入防止物件覆寫
<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 第 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 (星號) 值。

您可以搭配下列 API 使用 `If-None-Match` 標頭：
+ [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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南》*中的 。

### 使用 的條件式複製 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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南*》中的 。

### 使用 進行條件式分段上傳 AWS CLI
<a name="conditional-writes-mpu-complete-CLI-key-names"></a>

下列`complete-multipart-upload`範例命令會嘗試使用金鑰名稱為 之物件的條件式寫入來完成分段上傳`dir-1/my_images.tar.bz2`。在此範例中，檔案：// 字首用於從本機資料夾中名為 的檔案載入 JSON 結構`mpustruct`，其中列出已針對 tnis 特定分段上傳上傳的所有組件。

```
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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南*》中的 。

## 如果物件已變更，如何防止覆寫
<a name="conditional-write-etags"></a>

物件的 ETag 是物件的唯一字串，反映物件內容的變更。您可以使用 `If-Match` 標頭，將 Amazon S3 儲存貯體中物件的 ETag 值與您在 `WRITE` 操作期間提供的 ETag 值進行比較。如果 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 值。

您可以搭配下列 API 使用 `If-Match` 標頭：
+ [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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南*》中的 。

### 使用 的條件式複製 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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南》*中的 。

### 使用 進行條件式分段上傳 AWS CLI
<a name="conditional-writes-mpu-complete-CLI-etags"></a>

下列`complete-multipart-upload`範例命令會嘗試使用提供的 ETag 值 ，以條件式寫入完成分段上傳`6805f2cfc46c0f04559748bb039d69ae`。在此範例中，檔案：// 字首用於從本機資料夾中名為 的檔案載入 JSON 結構`mpustruct`，其中列出已針對 tnis 特定分段上傳上傳的所有組件。

```
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？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南》*中的 。

## 條件式寫入行為
<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` 時，必須使用 `CreateMultipartUpload` 重新啟動整個分段上傳，才能在收到 `409 Conflict` 錯誤之後再次上傳物件。

**具有 `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` 回應。

![\[兩個用戶端使用相同金鑰名稱寫入項目的範例。一個使用 UploadPart 進行 MPU，另一個使用 PutObject 和條件式寫入。之後啟動的 CompleteMultipartUpload 操作會失敗。\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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` 區塊來指定政策何時生效。對於分段上傳，您必須指定 `s3:ObjectCreationOperation` 條件索引鍵來排除 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` 操作，因為這些 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：僅允許使用 `PutObject` 和包含 `if-none-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件](#conditional-writes-enforce-ex1)
+ [範例 2：僅允許使用 `PutObject` 和包含 `if-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件](#conditional-writes-enforce-ex2)
+ [範例 3：僅允許包含 `if-none-match` 或 `if-match` 標頭的物件上傳請求](#conditional-writes-enforce-ex3)

## 範例 1：僅允許使用 `PutObject` 和包含 `if-none-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件
<a name="conditional-writes-enforce-ex1"></a>

如果請求包含 `if-none-match` 標頭，此政策允許帳戶 111122223333 使用者 Alice 寫入 *amzn-s3-demo-bucket1* 儲存貯體，以確保儲存貯體中不存在物件金鑰。對指定儲存貯體提出的所有 `PutObject` 和 `CompleteMultipartUpload` 請求都必須包含 `if-none-match` 標頭才能成功。使用此標頭時，只有在儲存貯體中不存在物件金鑰時，客戶才能寫入此儲存貯體。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

------
#### [ 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：僅允許使用 `PutObject` 和包含 `if-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件
<a name="conditional-writes-enforce-ex2"></a>

此政策允許帳戶 111122223333 使用者 Alice 只有在請求包含 `if-match` 標頭時，才能寫入 *amzn-s3-demo-bucket1*。此標頭會將 S3 中物件的 ETag 值與您在 `WRITE` 操作期間提供的 ETag 值進行比較。如果 ETag 值不相符，操作將會失敗。對指定儲存貯體提出的所有 `PutObject` 和 `CompleteMultipartUpload` 請求都必須包含 `if-match` 標頭才能成功。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

```
{
    "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>

此政策允許帳戶 111122223333 使用者 Alice 在請求包含 `if-none-match` 或 `if-match` 標頭時寫入 *amzn-s3-demo-bucket1*。這可讓 Alice 在儲存貯體中不存在金鑰名稱時上傳物件；或如果金鑰名稱存在，則 Alice 可以在物件 ETag 符合 `PUT` 請求中提供的 ETag 時覆寫物件。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

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

------

# 如何執行條件式刪除
<a name="conditional-deletes"></a>

您可以在刪除物件之前，使用條件式刪除來評估物件是否存在或保持不變。您可以使用 S3 一般用途和目錄儲存貯體中的 `DeleteObject` 或 `DeleteObjects` API 操作，執行條件式刪除。首先，當您提出條件式刪除請求時，可以使用附帶先決條件值 `*` 的 `HTTP If-Match` 標頭來檢查物件是否存在，或使用具有您提供的 `ETag` 的 `If-Match` 標頭來檢查物件是否已修改。

您可以使用 S3 儲存貯體或 Identity and Access Management (IAM) 政策，在一般用途儲存貯體層級強制執行條件式刪除。如需詳細資訊，請參閱[在 Amazon S3 儲存貯體上強制執行條件式刪除](conditional-delete-enforce.md)。

**注意**  
條件式刪除評估僅適用於物件的目前版本。

**Topics**
+ [如何在刪除物件之前檢查您的物件是否已修改](#conditional-deletes-etags)
+ [如何在刪除物件之前檢查您的物件是否存在](#conditional-delete)
+ [在 Amazon S3 儲存貯體上強制執行條件式刪除](conditional-delete-enforce.md)

## 如何在刪除物件之前檢查您的物件是否已修改
<a name="conditional-deletes-etags"></a>

 透過條件式刪除，可以預防您的應用程式免於意外刪除物件。您可以搭配 `ETag` 值使用 `HTTP If-Match` 標頭，檢查物件是否已修改。如果 S3 儲存貯體中的物件 `ETag` 值，與您在刪除作業期間提供的 `ETag` 不相符，操作會失敗。要使用 `DeleteObjects` 操作有條件地刪除多個物件，您必須在 XML 請求內文的物件 `ETag` 元素中提供 `ETag` 值。如需詳細資訊，請參閱[使用 Content-MD5 和 ETag 驗證上傳的物件](checking-object-integrity-upload.md#checking-object-integrity-etag-and-md5)。

**注意**  
要使用具有 `ETag` 值的 `If-Match` 標頭執行條件式刪除，您必須擁有 `s3:DeleteObject` 和 `s3:GetObject` 許可權。

具有 `ETag` 值的 `If-Match` 標頭，會根據儲存貯體中的現有物件進行評估。如果現有的物件具有相同的金鑰名稱和相符的 `ETag`，則 `DeleteObject` 請求會成功，且會傳回 `204 No content` 回應。如果 `ETag` 不相符，使用 `412 Precondition Failed` 回應的刪除操作會失敗。若要使用 `DeleteObjects`操作有條件地刪除多個物件，您可以在 XML 請求內文的 物件`ETag`元素中提供 `ETag`值。如果請求成功，`DeleteObjects`操作會以 回應，`200 OK`並提供回應內文中每個物件的狀態。如果先決條件成功，則會在回應內文的 `<Deleted>` 元素中擷取該物件的回應。如果先決條件失敗，則會在回應內文的 `<Error>` 元素中擷取該物件的回應。

 如果對物件的 `DELETE` 或 `PUT` 請求在對該物件執行條件刪除操作完成之前成功，則在並行發出請求的情況下，您也可能會收到 `409 Conflict` 錯誤回應。如果對物件的並行刪除請求在該物件的條件式寫入操作完成之前成功，您將會收到 `404 Not Found` 回應，因為物件金鑰不再存在。

對於下列 API，您可以搭配 `ETag` 值使用 `If-Match` 標頭：
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### 使用 AWS CLI
<a name="conditional-deletes-deleteobject-CLI-etags"></a>

下列 `delete-object` 範例命令會嘗試使用提供的 ETag 值 `6805f2cfc46c0f04559748bb039d69al`，執行條件式刪除。

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

如需詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html)。

下列 `delete-objects` 範例命令會嘗試使用提供的 ETag 值 `6805f2cfc46c0f04559748bb039d69al`，執行條件式刪除。

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}' 
```

如需詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html)。

如需 的相關資訊 AWS CLI，請參閱[什麼是 AWS Command Line Interface？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南*》中的 。

## 如何在刪除物件之前檢查您的物件是否存在
<a name="conditional-delete"></a>

 您可以搭配 `*` 值使用 `If-Match` 標頭，在嘗試刪除物件之前，先檢查物件是否存在。此 `*` 值表示，只有在物件存在時才需繼續進行操作，無論物件是否已修改。

刪除標記是版本控制的 S3 一般用途儲存貯體中的特殊物件，表示物件已刪除。它們是預留位置，可讓物件在保留先前版本時，顯示為刪除。因此，當您搭配 `DeleteObject` API 使用 `If-Match:*` 時，只有當物件存在時，操作才會成功並傳回 `204 No Content`。如果物件的最新版本是刪除標記，則物件不存在，且 `DeleteObject` API 會失敗，並傳回 `412 Precondition Failed` 回應。如需刪除標記的詳細資訊，請參閱「[使用刪除標記](DeleteMarker.md)」。

若要使用 `DeleteObjects` 操作以有條件地刪除多個物件，您可以在 XML 請求內文中物件的 `ETag` 元素中，提供 `*`。如果先決條件成功，`DeleteObjects` 操作會以 `200 OK` 回應，並提供回應內文中每個物件的狀態。如果先決條件成功，則會在回應內文的 `<Deleted>` 元素中擷取該物件的回應。如果先決條件失敗，則會在回應內文的 `<Error>` 元素中擷取該物件的回應。如果物件在評估任一先決條件時不存在，S3 會拒絕請求，並傳回 `Not Found` 錯誤回應。

**注意**  
 若要使用 `If-Match:*` 執行條件式刪除，您必須具有 `s3:DeleteObject` 許可權。

對於下列 API，您可以搭配 `*` 值使用 `If-Match` 標頭：
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### 使用 AWS CLI
<a name="conditional-deleteobject-CLI-etags"></a>

下列 `delete-object` 範例命令會嘗試對金鑰名稱為 `my_images.tar.bz2`，且值 `*` 代表任何 ETag 的物件，執行條件式刪除。

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

如需詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html)。

下列 `delete-objects` 範例命令會嘗試對金鑰名稱為 `my_images.tar.bz2`，且值 `*` 代表任何 ETag 的物件，執行條件式刪除。

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}' 
```

如需詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html)。

如需 的相關資訊 AWS CLI，請參閱[什麼是 AWS Command Line Interface？](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) *AWS Command Line Interface 《 使用者指南》*中的 。

# 在 Amazon S3 儲存貯體上強制執行條件式刪除
<a name="conditional-delete-enforce"></a>

 透過使用 Amazon S3 儲存貯體政策，您可以針對一般用途儲存貯體中的物件，強制執行 `If-Match` 標頭的條件式刪除。如果 `If-Match` 標頭不存在，則會使用 `403 Access Denied` 拒絕請求。儲存貯體政策是以資源為基礎的政策，您可以使用這些政策來將存取許可授予儲存貯體及其中物件。只有儲存貯體擁有者可建立政策與儲存貯體的關聯。如需儲存貯體政策的詳細資訊，請參閱「[Amazon S3 的儲存貯體政策](bucket-policies.md)」。

下列範例示範如何在儲存貯體政策中使用條件來強制用戶端使用 `If-Match` HTTP 標頭。

**Topics**
+ [範例 1：僅允許使用具有 `ETag` 值的 `If-Match` 標頭進行條件式刪除](#conditional-writes-enforce-ex1)
+ [範例 2：僅允許使用具有 `*` 值的 `If-Match` 標頭進行條件式刪除](#conditional-deletes-enforce-ex2)

## 範例 1：僅允許使用具有 `ETag` 值的 `If-Match` 標頭進行條件式刪除
<a name="conditional-writes-enforce-ex1"></a>

您可以使用此儲存貯體政策，僅允許使用 `DeleteObject` 和 `DeleteObjects` 請求的條件式刪除，該請求包含具有 `ETag` 值的 `If-Match` 標頭。`Null` 條件可確保 `If-Match`標頭存在，並授予 `s3:GetObject`許可，因為具有特定 ETag 值的條件式刪除需要 `s3:DeleteObject`和 `s3:GetObject`許可。所有非條件式刪除都會遭到拒絕，並且會進行條件式刪除。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalDeletes",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        },
         {
            "Sid": "AllowGetObjectBecauseConditionalDeleteIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

## 範例 2：僅允許使用具有 `*` 值的 `If-Match` 標頭進行條件式刪除
<a name="conditional-deletes-enforce-ex2"></a>

您可以使用此儲存貯體政策，僅允許使用 `DeleteObject` 和 `DeleteObjects` 請求的條件式刪除，該請求包含具有 `*` 值的 `If-Match` 標頭。`Null` 條件可確保`If-Match`標頭存在。由於 `s3:GetObject` 未授予，具有特定 ETag 值的條件式刪除將會失敗 – 只有 `If-Match: *`（檢查物件是否存在且只需要`s3:DeleteObject`許可） 會成功。所有非條件式刪除都會被拒絕，只有`If-Match: *`條件式刪除會成功。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalDeletes",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        }
    ]
}
```