[アップデート] Amazon S3 Express One Zone でオブジェクトのリネームができるようになりました
Amazon S3 Express One Zone のディレクトリバケットにおいて、保存してあるオブジェクトのリネームができるようになりました。現時点では、通常の S3 バケットはRenameObject
API をサポートしていませんのでご注意ください。
何が嬉しいのか
これまでの課題感
Amazon S3 では保存したオブジェクトに対するリネーム操作が提供されていませんでした。オブジェクトの名前を変更するには、以下の 2 段階の操作が必要でした。
- 元のオブジェクトを新しい名前でコピー
- 元のオブジェクトを削除
この方法でリネームすると以下の悩みを抱えます。
- 処理時間の問題: 大容量ファイルはコピーに時間を要する
- コストの問題: データ転送料金とリクエスト料金が発生
- メタデータの問題: タイムスタンプなどのメタデータがコピーにより変わってしまう
- 整合性の問題: 途中で失敗すると不完全な状態になりうるリスク
S3 Express One Zone は我々の想像するリネームに対応した
S3 Express One Zone のディレクトリバケットには、新規のRenameObject
API が提供され、上記の課題が解決されました。
- 高速処理: 巨大なファイルサイズでも数ミリ秒でリネーム
- データコピー不要: コピーしないのでデータ転送なしで名前変更
- アトミック操作: 単一 API 呼び出しによる確実な処理
- メタデータ保持: オブジェクトのメタデータが変わらない
スラッシュ (/
) で終わるオブジェクトはリネーム不可などの諸条件があります。詳細は最新のドキュメントをご確認ください。
大切なことなのでもう一度書きますが、現在は S3 Express One Zone のみで利用可能です。
料金体系
RenameObject
操作は、S3 Express One Zone の PUT
、COPY
、POST
、LIST
リクエストと同じ料金で提供されます。
S3 Express One Zone is the only storage class that supports the RenameObject API, which is priced the same as PUT, COPY, POST, LIST requests (per 1,000 requests) in S3 Express One Zone. There are no data upload or data retrieval changes with the RenameObject API.
引用: https://aws.amazon.com/s3/pricing/?nc1=h_ls
やってみた
S3 Express One Zone のオブジェクトに対してリネームを AWS CLI で試してみます。AWS CLI 以外では、マネージメントコンソール、AWS SDK、REST API、Moutpoint for Amazon S3 も対応サポートしています。
10GB のテストファイルを使用して、従来の Copy + Delete によるリネームと、新機能のRenameObject
API を利用したリネーム違いを検証します。
検証環境の準備
10GB のテストファイルを作成し、S3 Express One Zone バケットにアップロードします。
# テストファイルのサイズを確認
$ ls -lh 10GB_file.bin
-rw-r--r--@ 1 ohmura.yasutaka staff 10G 6 19 17:08 10GB_file_copy.bin
このファイルを S3 Express One Zone のディレクトリバケットにアップロードします。
# S3 Express One Zone のディレクトリバケットへアップロード
$ aws s3 cp 10GB_file.bin s3://mountpoint-for-s3--apne1-az4--x-s3/ --no-progress
upload: ./10GB_file.bin to s3://mountpoint-for-s3--apne1-az4--x-s3/10GB_file_copy.bin
新機能のリネーム方法
新しい RenameObject
API を使用してファイル名を変更します。
$ time aws s3api rename-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_renamed_timed.bin \
--rename-source 10GB_file_copy.bin
早い!
real 0m0.722s
user 0m0.28s
sys 0m0.12s
メタデータの比較
RenameObject
API のリネームでは LastModified
タイムスタンプが 元のまま保持 されています。
# リネーム前にオブジェクトを確認
$ aws s3api head-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_copy.bin
{
"AcceptRanges": "bytes",
"Expiration": "NotImplemented",
"LastModified": "2025-06-19T08:19:36+00:00",
"ContentLength": 10737418240,
"ETag": "\"26bc0412592742d8a8903640c8868e69-1280\"",
"ContentType": "application/octet-stream",
"ServerSideEncryption": "AES256",
"Metadata": {},
"StorageClass": "EXPRESS_ONEZONE"
}
# リネーム後のオブジェクトを確認
$ aws s3api head-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_renamed_timed.bin
{
"AcceptRanges": "bytes",
"Expiration": "NotImplemented",
"LastModified": "2025-06-19T08:19:36+00:00",
"ContentLength": 10737418240,
"ETag": "\"26bc0412592742d8a8903640c8868e69-1280\"",
"ContentType": "application/octet-stream",
"ServerSideEncryption": "AES256",
"Metadata": {},
"StorageClass": "EXPRESS_ONEZONE"
}
従来方式(Copy + Delete)のリネーム方法
従来の Copy + Delete 方式も試してみました。
リネーム対象のオブジェクトコピー
$ time aws s3api copy-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_copy_test.bin \
--copy-source mountpoint-for-s3--apne1-az4--x-s3/10GB_file_renamed_timed.bin \
--metadata-directive COPY
ローカル PC で実行したため、10GB ファイル転送するとさすがに時間がかかりました。
real 1m2.30s
user 0m0.28s
sys 0m0.13s
古いオブジェクトの削除
$ time aws s3api delete-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_renamed.bin
削除は一瞬でした。
real 0m0.682s
user 0m0.27s
sys 0m0.12s
メタデータの比較
LastModified
とETag
はコピーしたので更新されました。メタデータで変更されるのはタイムスタンプだけかなと思いながらやっていたのですが、Etag の存在をここで思い出しました。
# リネーム前にオブジェクトを確認
$ aws s3api head-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_renamed_timed.bin
{
"AcceptRanges": "bytes",
"Expiration": "NotImplemented",
"LastModified": "2025-06-19T08:54:09+00:00",
"ContentLength": 10737418240,
"ETag": "\"4f5cd79eb1f041b695adc50f03c5f645\"",
"ContentType": "application/octet-stream",
"ServerSideEncryption": "AES256",
"Metadata": {},
"StorageClass": "EXPRESS_ONEZONE"
}
# リネーム後のオブジェクトを確認
$ aws s3api head-object \
--bucket mountpoint-for-s3--apne1-az4--x-s3 \
--key 10GB_file_copy_comparison.bin
{
"AcceptRanges": "bytes",
"Expiration": "NotImplemented",
"LastModified": "2025-06-19T10:45:25+00:00",
"ContentLength": 10737418240,
"ETag": "\"77eb7c9a41ae4f9e92ce94c0a9701e8a\"",
"ContentType": "application/octet-stream",
"ServerSideEncryption": "AES256",
"Metadata": {},
"StorageClass": "EXPRESS_ONEZONE"
}
実行結果の比較
10GB のオブジェクトのコピーが発生しない分、処理時間の短縮とメタデータの保持が大きな違いでした。コピー時間は環境によるのであくまでも参考値としてみてください。
方式 | コピー時間 | 削除時間 | 合計時間 | データ転送 | API呼び出し回数 | メタデータ |
---|---|---|---|---|---|---|
従来方式 (Copy + Delete) | 1分2秒 | 0.682秒 | 約1分3秒 | 10GB | 2回 | 一部更新される |
RenameObject API | - | - | 0.722秒 | 0GB | 1回 | 保持される |
まとめ
Amazon S3 Express One Zone の RenameObject
API 追加は、従来から課題であったリネームのためにコピーしないといけない問題を解決してくれました。
おわりに
通常の S3 バケットもリネームに対応してくれれば、大容量のログファイルのローテーションに使えるのではないかと思いました。logrotate の様な感じで最新格納先は同じ名前(パス)にして、古いのはリネームしていく運用もできそうです。私は S3 Express One Zone を使う方なのですが、S3 バケットのサポートを期待して待ってます。