

# 条件付き削除を実行する方法
<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>

 条件付き削除を使用すると、オブジェクトの偶発的な削除からアプリケーションを保護できます。`HTTP If-Match` ヘッダーと `ETag` 値を使用して、オブジェクトが変更されたかどうかを確認できます。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` を受け取ることになります。

`ETag` 値を持つ `If-Match` ヘッダーは、次の API で使用できます。
+ [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 ユーザーガイド**」の「[AWS Command Line Interface とは](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」を参照してください。

## オブジェクトを削除する前にオブジェクトが存在するかどうかを確認する方法
<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` アクセス許可が必要です。

`*` 値を持つ `If-Match` ヘッダーは、次の API で使用できます。
+ [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 ユーザーガイド**」の「[AWS Command Line Interface とは](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」を参照してください。