S3バケットのオブジェクトの中身を更新し、aws S3 syncコマンドで同期しましたがファイルが更新されません

2024.05.07

困っていた内容

S3バケットのオブジェクトの中身を text1 → text2 のように変更し、AWS CLIのaws S3 syncを使用し同期しましたがファイルが更新されません。

原因

AWS CLIのaws S3 syncを使用し、S3からローカルに同期する際、デフォルトの動作は、ローカルのバージョンがS3のバージョンより新しくない限り、同じサイズのアイテムは無視される仕様です。

言い換えると、オブジェクトの中身を更新してもオブジェクトサイズが同じバイト数である場合、およびローカルバージョンのタイムスタンプがS3バージョンよりも古い場合には更新されません。

下記に説明がありました。

--exact-timestamps (boolean) When syncing from S3 to local, same-sized items will be ignored only when the timestamps match exactly. The default behavior is to ignore same-sized items unless the local version is newer than the S3 version.

引用元: aws s3 sync - AWS CLI Command Reference

対処方法

タイムスタンプが一致しないときには同期の対象とするように--exact-timestampsを指定します。

試してみた

デフォルトの仕様の動作確認

実際に試してみます。 まずは、S3にオブジェクトをアップロードします。オブジェクトの中身は以下です。

〜text.txt〜
text1
〜〜

S3バケット一覧を表示しました。オブジェクト名の左側の項目がバイト数となっています。

$ aws s3 ls s3://s3-sync-demo-01
2024-05-06 18:09:09          5 test.txt

syncコマンドでダウンロードします。

$ aws s3 sync s3://s3-sync-demo-01 .
download: s3://s3-sync-demo-01/test.txt to ./test.txt

ダウンロードに成功しました。

$ ls -l
total 4
-rw-r--r--. 1 ec2-user ec2-user 5 May  6 18:09 test.txt

中身はこのようになっています。

$ cat test.txt 
test1

test.txtを下記のように書き換えS3バケットに再度アップロードしました。

〜test.txt〜
text2
〜〜

S3バケット側へのアップロード時間が更新されていることを確認しました。オブジェクトサイズは同じです。

$ aws s3 ls s3://s3-sync-demo-01
2024-05-06 18:13:10          5 test.txt

先ほどと同様に下記コマンドで同期してみましたが、ダウンロードされませんでした。

$ aws s3 sync s3://s3-sync-demo-01 .
$

タイムスタンプも更新されていません。

$ ls -l
total 4
-rw-r--r--. 1 ec2-user ec2-user 5 May  6 18:09 test.txt

念の為、中身を確認しましたが更新されていません。

$ cat test.txt 
test1

「--exact-timestamps」オプション付きで動作確認

そこで、対処方法である--exact-timestampsオプションをつけて試しました。 下記コマンドでダウンロードされたようです。

$ aws s3 sync --exact-timestamps s3://s3-sync-demo-01 .
download: s3://s3-sync-demo-01/test.txt to ./test.txt

タイムスタンプが更新されています。

$ ls -l
total 4
-rw-r--r--. 1 ec2-user ec2-user 5 May  6 18:13 test.txt

中身も更新されていました。

$ cat test.txt 
test2

追記

こちらの件についての調査中に下記ブログを発見し参考にさせていただきました。約9年前のブログです。期間が経っているため検証してみましたが同様の仕様でした。

参考