S3バケットのオブジェクトの中身を更新し、aws S3 syncコマンドで同期しましたがファイルが更新されません
困っていた内容
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年前のブログです。期間が経っているため検証してみましたが同様の仕様でした。