2024年8月20日に Amazon S3 の conditional writes(条件付き書き込み)がサポートされた💡オブジェクトの上書きを防ぐ仕組みを独自実装せず,Amazon S3 に任せられるようになるところがメリットだと思う.
試す
さっそく PutObject を試す.AWS CLI だと --if-none-match
オプションを指定すれば OK👌
aws s3api put-object
コマンドの2回目の実行で PreconditionFailed
エラーが出ることを確認できた.
$ echo 'hello' > hello.txt $ BUCKET=kakakakakku-sandbox-conditional-writes $ aws s3api create-bucket \ --bucket ${BUCKET} \ --create-bucket-configuration LocationConstraint=ap-northeast-1 # 1回目 $ aws s3api put-object \ --bucket ${BUCKET} \ --key hello.txt \ --body hello.txt \ --if-none-match '*' { "ETag": "\"b1946ac92492d2347c6235b4d2611184\"", "ServerSideEncryption": "AES256" } # 2回目 $ aws s3api put-object \ --bucket ${BUCKET} \ --key hello.txt \ --body hello.txt \ --if-none-match '*' An error occurred (PreconditionFailed) when calling the PutObject operation: At least one of the pre-conditions you specified did not hold
LocalStack で試す
実は2024年8月29日にリリースされた LocalStack v3.7.0 で Amazon S3 の conditional writes(条件付き書き込み)がサポートされている❗️あまりに早すぎる \( 'ω')/
さっそく最新の LocalStack v3.7.2 を使って試す.
$ localstack --version 3.7.2
結論としてはまったく同じだった👌aws
コマンドを awslocal
コマンドに変更すれば良く,LocalStack で Amazon S3 の conditional writes(条件付き書き込み)を試せた❗️
$ echo 'hello' > hello.txt $ BUCKET=kakakakakku-sandbox-conditional-writes $ awslocal s3api create-bucket \ --bucket ${BUCKET} \ --create-bucket-configuration LocationConstraint=ap-northeast-1 # 1回目 $ awslocal s3api put-object \ --bucket ${BUCKET} \ --key hello.txt \ --body hello.txt \ --if-none-match '*' { "ETag": "\"b1946ac92492d2347c6235b4d2611184\"", "ServerSideEncryption": "AES256" } # 2回目 $ awslocal s3api put-object \ --bucket ${BUCKET} \ --key hello.txt \ --body hello.txt \ --if-none-match '*' An error occurred (PreconditionFailed) when calling the PutObject operation: At least one of the pre-conditions you specified did not hold