条件付き書き込みによるオブジェクトの上書きを防ぐ方法 - Amazon Simple Storage Service

条件付き書き込みによるオブジェクトの上書きを防ぐ方法

条件付き書き込みでは、書き込みリクエストにヘッダーを追加して、S3 オペレーションに前提条件を指定できます。これにより、バケットに同じキー名を持つ既存のオブジェクトがないことを検証することで、既存のデータの上書きを防ぐことができます。条件付き書き込みは、汎用バケットおよびディレクトリバケットへの API リクエストに対して機能します。

オブジェクトを Amazon S3 にアップロードするときは、キー名を指定します。キー名とは、バケット内のオブジェクトの大文字と小文字を区別した固有の識別子です。バージョン管理されていないバケットまたはバージョニングが停止されたバケットに同じキー名を持つオブジェクトをアップロードすると、オブジェクトは上書きされます。バージョニングされたバケットでは、最後にアップロードしたオブジェクトがオブジェクトの最新バージョンになります。

条件付き書き込みは、WRITE オペレーション中にオブジェクトの存在をチェックします。バケット内で同じキー名が見つかると、WRITE オペレーションは失敗します。条件付き書き込みを使用すると、既存のオブジェクトを上書きすることなく、複数のクライアントが同じバケットに書き込むことができます。

条件付き書き込みを実行するには、s3:PutObject のアクセス許可が必要です。この許可により、呼び出し元はバケット内のオブジェクトの存在を確認できます。AWS SDK では、署名付き URL を使って、条件付き書き込みを使用できます。

注記

条件付き書き込みを使用するには、HTTPS (TLS) 経由でリクエストを行うか、AWS Signature Version 4 を使用してリクエストに署名する必要があります。

サポートされている API

条件付き書き込みの使用をサポートする S3 API は、次のとおりです。

次のヘッダーを使用して、オブジェクトキー名に基づくオブジェクトを書き込むことができます。オブジェクトキー名の詳細については、「Amazon S3 オブジェクトに命名する」を参照してください。

PutObject

  • If-None-Match — 指定したバケット内に同じキー名を持つ既存のオブジェクトが存在しない場合にのみ、オブジェクトをアップロードします。このパラメータには、* (アスタリスク) の値を使用する必要があります。

次の put-object コマンド例では、AWS CLI で if-none-match パラメータを使用した条件付き書き込みヘッダーを持つオブジェクトをアップロードする方法を説明しています。

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 コマンドリファレンスの「put-object」を参照してください。

AWS CLI の詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface とは」を参照してください。

このヘッダーの詳細については、「Amazon Simple Storage Service API リファレンス」の「PutObject」を参照してください。

CompleteMultipartUpload

  • If-None-Match — 指定したバケット内に同じキー名を持つ既存のオブジェクトが存在しない場合にのみ、アップロードを完了します。このパラメータには、* (アスタリスク) の値を使用する必要があります。

次の complete-multipart-upload コマンド例では、AWS CLI で if-none-match パラメータを使用した条件付き書き込みヘッダーを使ってマルチパートアップロードを完了する方法を説明しています。

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

詳細については、AWS CLI コマンドリファレンスの「complete-multipart-upload」を参照してください。

AWS CLI の詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface とは」を参照してください。

このヘッダーの詳細については、「Amazon Simple Storage Service API リファレンス」の「CompleteMultipartUpload」を参照してください。

条件付き書き込みの動作

条件付き書き込みは、バケット内の既存のオブジェクトに対して評価を実行します。バケットに同じキー名を持つ既存のオブジェクトがない場合、書き込みオペレーションは成功であり、200 レスポンスが返されます。既存のオブジェクトがある場合、書き込みオペレーションは失敗であり、412 Precondition Failed レスポンスが返されます。バージョニングが有効になっているバケットの場合、S3 は条件評価の一環として、同じ名前の現在のオブジェクトバージョンが存在するかどうかを確認します。同じ名前の現在のオブジェクトバージョンが存在しない場合、または現在のオブジェクトバージョンに削除マーカーがある場合、書き込みオペレーションは成功します。それ以外の場合は、書き込みオペレーションは失敗して、412 Precondition Failed レスポンスを返します。

同じオブジェクト名に対して複数の条件付き書き込みが発生すると、最初の書き込みオペレーションは成功します。その後、Amazon S3 は以降の書き込みを失敗として、412 Precondition Failed レスポンスを返します。

同時リクエストが発生した場合、そのオブジェクトに対する条件付き書き込みオペレーションが完了する前に、そのオブジェクトへの削除リクエストが成功すると、409 Conflict レスポンスも受け取ることができます。これは、この削除リクエストが、以前に開始された条件付き書き込みオペレーションよりも優先されるためです。PutObject で条件付き書き込みを使用する場合、409 エラーを受け取った後にアップロードが再試行される場合があります。CompleteMultipartUpload を使用する場合、409 エラーを受け取った後にオブジェクトを再度アップロードするには、CreateMultipartUpload を使用してマルチパートアップロードを再開する必要があります。

2 つのクライアントが同じバケットでオペレーションを実行しているような、以下のシナリオについて考えてみましょう。

412 前提条件の失敗レスポンス

実行中のマルチパートアップロードリクエストは完全には書き込まれていないため、条件付き書き込みでは考慮されません。クライアント 1 がマルチパートアップロードを使用してオブジェクトをアップロード中である、次の例を考えてみましょう。このマルチパートアップロード中、クライアント 2 は条件付き書き込みオペレーションを使用して同じオブジェクトの書き込みを正常に実行できます。その後、クライアント 1 が条件付き書き込みを使用してマルチパートアップロードを完了しようとすると、既にオブジェクトが存在するため、アップロードは失敗します。

同じキー名で項目を書き込む 2 つのクライアントの例。1 つは MPU の UploadPart、もう 1 つは PutObject と条件付き書き込み。その後に開始される CompleteMultipartUpload オペレーションは失敗する。
409 Conflict レスポンス

条件付き書き込みリクエストが完了する前に削除リクエストが正常に完了すると、Amazon S3 は書き込みオペレーションについて 409 Conflict レスポンスを返します。これは、先に開始された削除リクエストが条件付き書き込みオペレーションよりも優先されるためです。バケットに puppy.txt というファイル がある、次のような例を考えてみましょう。クライアント 1 は、条件付き書き込みを使って、マルチパートアップロードを完了する意図で、同じ puppy.txt という名前の別のファイルのマルチパートアップロードを開始します。このアップロード中に、クライアント 2 はバケットから puppy.txt を削除します。クライアント 1 が条件付き書き込みで CompleteMultipartUpload を使用して自身の puppy.txt ファイルをアップロードしようとすると、失敗して 409 Conflict レスポンスが返されます。このような場合、新しいマルチパートアップロードを開始する必要があります。

2 つのクライアントの例。1 つはマルチパートアップロードを使用し、もう 1 つはこの MPU 開始後に削除リクエストを送信する。この削除リクエストは、条件付き書き込みが開始される前に終了する。
注記

ストレージコストを最小限に抑えるため、AbortIncompleteMultipartUpload アクションを使用して指定した日数が経過した後に不完全なマルチパートアップロードを削除するようにライフサイクルルールを設定することをお勧めします。不完全なマルチパートアップロードを削除するライフサイクルルールの作成の詳細については、「不完全なマルチパートアップロードを中止するためのバケットライフサイクルポリシーの設定」を参照してください。