

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

# 如何執行條件式刪除
<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 《 使用者指南》*中的 。