Open1

【新機能】Amazon S3が条件付き書き込みをサポート

kabir_カビルkabir_カビル

今回の新機能により、PutObjectやマルチパートアップロードAPIを通じてオブジェクトを作成する前に、そのオブジェクトの存在を確認することができるようになりました。

これまでは、S3に既に存在するオブジェクトに書き込むと、そのオブジェクトが上書きされていました。なので、まずGetObjectを呼び出してオブジェクトの存在を確認し、その後PutObjectを呼び出すようなやり方でした。
単一スレッドのアプリケーションではこの方法でも問題ないかもしれませんが、複数の同時処理を行う分散システムでは、扱いが非常に難しいレースコンディションが発生する可能性があります。

この新機能を使用すると、PutObjectまたはCompleteMultipartUploadのAPIリクエストに新しく「IfNoneMatch」という引数を付けることができるようになりました。

以下の例では、IfNoneMatchの入力フィールドにアスタリスク(*)を指定しています。こちらのレスポンスで「PreconditionFailed」というエラーコードが帰ってきたらすでに同じキー名のオブジェクトがバケット内に存在することになります。この機能は非常に便利です。

try {
    $result = $s3->putObject([
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'Body'   => $body,
        'IfNoneMatch' => '*'
    ]);
} catch (AwsException $e) {
    if ($e->getAwsErrorCode() === 'PreconditionFailed') {
        echo "Already created... \n";
    } else {
        throw $e;
    }
}