🎵

[S3]AWS CLIを使って、オブジェクトのタイムスタンプを更新したかった話

2024/07/22に公開

やりたいこと

記事のタイトル通りですが、、、
AWS CLIコマンドを使って、既にS3上に配置されているオブジェクトに関して、データ自体は変えずにタイムスタンプだけ更新したいという要望がありました。

GitHub Copilotに聞いてみた

株式会社Goalsでは、希望するエンジニアにGitHub Copilotを導入しています。

そこで、GitHub Copilot Chatと以下のようなやりとりをしました。

imamura-ko-0314
AWS CLIコマンドを使って、S3のオブジェクトのタイムスタンプだけ更新する方法はありますか?

GitHub Copilot
AWS CLIを使用してS3のオブジェクトのタイムスタンプを直接更新する方法はありません。
S3のオブジェクトはイミュータブル(不変)であり、一度作成されるとその内容やメタデータは変更できません。
タイムスタンプを更新するためには、オブジェクトを新たにアップロードし直す必要があります。

以下のコマンドは、同じオブジェクトを再アップロードすることでタイムスタンプを更新する例です:

aws s3 cp s3://your-bucket/your-object s3://your-bucket/your-object

このコマンドは、指定したオブジェクトをS3からダウンロードし、同じ場所に再アップロードします。
これにより、オブジェクトの最終更新日時が現在の日時に更新されます。

ただし、この方法はオブジェクトのデータが変更されないため、S3のバージョニングが有効になっている場合、新しいバージョンは作成されません。
また、大きなオブジェクトに対しては時間と帯域幅がかかるため、注意が必要です。

どうやらタイムスタンプを直接更新することはできないようですね。
ただし、同じオブジェクトを再アップロードする案を提示してくれました!

GitHub Copilotのアドバイス通り、aws s3 cpコマンドを使います。

実際に動かしてみた

より詳細なやりたいこととして、特定のパス以下の全オブジェクトに対して、更新処理(再アップロード)の実施を考えていました。
そのため、--recursiveオプションを追加して以下のコマンドを作成しました。

aws s3 cp s3://XXXX_bucket/AAAA_path/ s3://XXXX_bucket/AAAA_path/ --recursive

最終的に、コピー元とコピー先が同様の、よく目にするaws s3 cpコマンドとなりました。

まとめ

上記コマンドを実行することで、やりたかった特定のパス以下の全オブジェクトの更新が成功しました!!
ちょっとした疑問は、GitHub Copilotに聞いたら何でも答えてくれるので、最高のビジネスパートナーですね!!

また、AWS CLIコマンドに関して、詳細な挙動や各オプションの確認は公式のコマンドリファレンスが、最も優れていると思っています。

今回使用した、aws s3 cpコマンドに関するリファレンスも貼り付けておきます。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html

Goals Tech Blog

Discussion