[アップデート] Amazon S3 Express One Zone でオブジェクトのリネームができるようになりました

[アップデート] Amazon S3 Express One Zone でオブジェクトのリネームができるようになりました

Clock Icon2025.06.19

Amazon S3 Express One Zone のディレクトリバケットにおいて、保存してあるオブジェクトのリネームができるようになりました。現時点では、通常の S3 バケットはRenameObject API をサポートしていませんのでご注意ください。

Untitled(22).png

https://aws.amazon.com/jp/about-aws/whats-new/2025/06/amazon-s3-express-one-zone-atomic-renaming-objects-api

何が嬉しいのか

これまでの課題感

Amazon S3 では保存したオブジェクトに対するリネーム操作が提供されていませんでした。オブジェクトの名前を変更するには、以下の 2 段階の操作が必要でした。

  1. 元のオブジェクトを新しい名前でコピー
  2. 元のオブジェクトを削除

この方法でリネームすると以下の悩みを抱えます。

  • 処理時間の問題: 大容量ファイルはコピーに時間を要する
  • コストの問題: データ転送料金とリクエスト料金が発生
  • メタデータの問題: タイムスタンプなどのメタデータがコピーにより変わってしまう
  • 整合性の問題: 途中で失敗すると不完全な状態になりうるリスク

S3 Express One Zone は我々の想像するリネームに対応した

S3 Express One Zone のディレクトリバケットには、新規のRenameObject API が提供され、上記の課題が解決されました。

  • 高速処理: 巨大なファイルサイズでも数ミリ秒でリネーム
  • データコピー不要: コピーしないのでデータ転送なしで名前変更
  • アトミック操作: 単一 API 呼び出しによる確実な処理
  • メタデータ保持: オブジェクトのメタデータが変わらない

スラッシュ (/) で終わるオブジェクトはリネーム不可などの諸条件があります。詳細は最新のドキュメントをご確認ください。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html

大切なことなのでもう一度書きますが、現在は S3 Express One Zone のみで利用可能です。

料金体系

RenameObject 操作は、S3 Express One Zone の PUTCOPYPOSTLIST リクエストと同じ料金で提供されます。

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

メタデータの比較

LastModifiedETagはコピーしたので更新されました。メタデータで変更されるのはタイムスタンプだけかなと思いながらやっていたのですが、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 バケットのサポートを期待して待ってます。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.