条件付き削除を実行する方法
条件付き削除を使用すると、オブジェクトを削除する前に、オブジェクトが存在するか、変更されていないかを評価できます。条件付き削除は、S3 汎用バケットとディレクトリバケットの DeleteObject または DeleteObjects API オペレーションを使用して実行できます。まず、条件付き削除リクエストを行うときに、HTTP If-Match ヘッダーに前提条件値として * を指定してオブジェクトが存在するかどうかを確認するか、ETag を If-Match ヘッダーに指定してオブジェクトが変更されたかどうかを確認できます。
S3 バケットまたは Identity and Access Management (IAM) ポリシーを使用して、汎用バケットレベルで条件付き削除を適用できます。詳細については、「Amazon S3 バケットに条件付き削除を強制する」を参照してください。
注記
条件付き削除の評価は、オブジェクトの最新バージョンにのみ適用されます。
トピック
オブジェクトを削除する前にオブジェクトが変更されたかどうかを確認する方法
条件付き削除を使用すると、オブジェクトの偶発的な削除からアプリケーションを保護できます。HTTP If-Match ヘッダーと ETag 値を使用して、オブジェクトが変更されたかどうかを確認できます。S3 バケット内のオブジェクトの ETag 値が、削除オペレーション中に指定した ETag と一致しない場合、オペレーションは失敗します。DeleteObjects オペレーションを使用して複数のオブジェクトを条件付きで削除するには、XML リクエスト本文のオブジェクトの ETag 要素に ETag 値を指定する必要があります。詳細については、「Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する」を参照してください。
注記
ETag 値を持つ If-Match ヘッダーで条件付き削除を実行するには、s3:DeleteObject および s3:GetObject アクセス許可が必要です。
ETag 値を持つ If-Match ヘッダーは、バケット内の既存のオブジェクトに対して評価されます。同じキー名と一致する ETag を持つ既存のオブジェクトがある場合、DeleteObject リクエストは成功し、204 No content レスポンスを返します。ETag が一致しない場合、削除オペレーションは 412 Precondition Failed レスポンスで失敗します。成功すると、DeleteObjects API は 200 OK で応答し、バッチ削除リクエストのレスポンスの本文内の各オブジェクトのステータスを提供します。DeleteObjects リクエストの前提条件が満たされない場合、Amazon S3 はオブジェクトを削除し、Pre-condition 失敗エラーレスポンスを返します。
同時リクエストが発生した場合、そのオブジェクトに対する条件付き書き込みオペレーションが完了する前に、そのオブジェクトへの DELETE または PUT リクエストが成功すると、409 Conflict エラーレスポンスを受け取ることもあります。オブジェクトに対する条件付き書き込みオペレーションが完了する前にそのオブジェクトへの削除リクエストが成功すると、オブジェクトキーが存在しなくなるため、404 Not
Found を受け取ることになります。
ETag 値を持つ If-Match ヘッダーは、次の API で使用できます。
次の delete-object コマンド例は、指定された ETag 値 6805f2cfc46c0f04559748bb039d69al を使用して条件付き削除を実行しようとします。
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "6805f2cfc46c0f04559748bb039d69al"
詳細については、AWS CLI コマンドリファレンスの「delete-object
次の delete-objects コマンド例は、指定された ETag 値 6805f2cfc46c0f04559748bb039d69al を使用して条件付き削除を実行しようとします。
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}'
詳細については、AWS CLI コマンドリファレンスの「delete-objects
AWS CLI の詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface とは」を参照してください。
オブジェクトを削除する前にオブジェクトが存在するかどうかを確認する方法
* 値を持つ If-Match ヘッダーを使用して、オブジェクトを削除する前にオブジェクトが存在するかどうかを確認できます。* 値は、オブジェクトが変更されたかどうかにかかわらず、オブジェクトが存在する場合にのみオペレーションを続行する必要があることを示します。
削除マーカーは、オブジェクトが削除されたことを示す、バージョニングされた S3 汎用バケットの特殊なオブジェクトです。これらは、以前のバージョンを保持しながらオブジェクトが削除されるようにするプレースホルダーです。したがって、DeleteObject API で If-Match:* を使用する場合、オペレーションはオブジェクトが存在する場合にのみ 204 No Content で成功します。オブジェクトの最新バージョンが削除マーカーである場合、オブジェクトは存在せず、DeleteObject API は失敗して 412 Precondition Failed レスポンスを返します。削除マーカーの詳細については、「削除マーカーの使用」を参照してください。
DeleteObjects オペレーションを使用して複数のオブジェクトを条件付きで削除するには、XML リクエスト本文のオブジェクトの ETag 要素に * を指定できます。前提条件が成功すると、DeleteObjects オペレーションは 200 OK で応答し、レスポンスの本文内の各オブジェクトのステータスを提供します。前提条件が成功すると、そのオブジェクトのレスポンスはレスポンスの本文の <Deleted> 要素にキャプチャされます。前提条件が失敗した場合、そのオブジェクトのレスポンスはレスポンス本文の <Error> 要素にキャプチャされます。いずれかの前提条件を評価するときにオブジェクトが存在しない場合、S3 はリクエストを拒否し、Not Found エラーレスポンスを返します。
注記
条件付き削除を実行するには、If-Match:* および s3:DeleteObject アクセス許可が必要です。
* 値を持つ If-Match ヘッダーは、次の API で使用できます。
次の delete-object コマンド例は、キー名が で値が my_images.tar.bz2* (任意の ETag を表す) であるオブジェクトに対して条件付き削除を実行しようとします。
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "*"
詳細については、AWS CLI コマンドリファレンスの「delete-object
次の delete-objects コマンド例は、キー名が で値が my_images.tar.bz2* (任意の ETag を表す) であるオブジェクトに対して条件付き削除を実行しようとします。
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}'
詳細については、AWS CLI コマンドリファレンスの「delete-objects
AWS CLI の詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface とは」を参照してください。