こんばんは。Koderaです。
Amazon S3で条件付き書き込みのサポートが開始されました。
https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-s3-conditional-writes/
アップデート内容
Amazon S3 では、オブジェクトを作成する前にオブジェクトが実際に存在しているか確認できる条件付き書き込みがサポートされました。
データのアップロード時にアプリケーションが既存のオブジェクトを上書きするのをより簡単に防ぐことができます。
対象は、汎用バケットとディレクトリバケットの両方です。
アップデートのメリットは、複数のクライアントを持つ分散アプリケーションが、共有データセット間でデータを同時並行で更新できるようになったことです。
データをアップロードする前にオブジェクトの存在を確認するために追加のAPIリクエストの利用する必要がなくなります。
conditional writes(条件付き書き込み)とは
S3への条件付き書き込みでは、書き込みリクエストに追加のヘッダーを使います。
条件付き書き込みの目的は、既存データの上書きの防止です。バケットに同じキー名を持つ既存のオブジェクトがすでに存在しないことを検証します。
条件付き書き込みには、s3:PutObject アクセス許可が必要です。
呼び出し元はバケット内のオブジェクトの存在を確認できます。SDKだと署名付き URL で条件付き書き込みができます。
条件付き書き込みを使用するには、HTTPS (TLS) 経由でリクエストを行うか、AWS署名バージョン4を使用してリクエストに署名する必要があります。
また、以下のAPIが条件付き書き込みをサポートしています。
PutObject
CompleteMultipartUpload
条件付き書き込みの挙動について
条件付き書き込みは、バケット内の既存のオブジェクトに対して実在確認がなされます。
当然、バージョニングしている場合は当然同じキー名となるので、どのような挙動になるのか簡単にまとめました。
バージョニングしていないとき
バケットに同じキー名を持つ既存のオブジェクトがない場合、書き込み操作は成功し、レスポンス200が返されます。
既存のオブジェクトがある場合、書き込み操作は失敗し、412 Precondition Failedが返されます。
同じオブジェクト名に対して複数の条件付き書き込みが発生した場合、最初に終了する書き込み操作は成功します。その後、Amazon S3 は 412 Precondition Failed レスポンスを返すことで、後続の書き込み処理は失敗となります。
バージョニングしているとき
バージョニングが有効な場合、S3 は条件付き書き込みの評価の一部として、同じ名前の現在のオブジェクトバージョンが存在するかどうかを確認します。同じ名前の現在のオブジェクト・バージョンがない場合、または現在のオブジェクト・バージョンが削除マーカーである場合、書込み操作は成功します。
バージョニングの有効化の有無にかかわらず、412 Precondition Failedが返されます。
また、同時リクエストの場合、レスポンス409 Conflictが返されることもあります。
まとめ
Amazon S3 では、オブジェクトを作成する前にオブジェクトが実際に存在しているか確認できる条件付き書き込みがサポートされるようになったので、実際の挙動も踏まえてアップデートを確認してみました。