
S3のオブジェクトの最終更新日時は何を元に決定されますか?
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていること
S3 にオブジェクトをアップロードしました。オブジェクトの最終更新日時を確認したところ、アップロード開始時間が記録されておりました。
アップロード完了時間をメタデータに保持したいのですが、どのようにすればいいでしょうか。
どう解決すればいいの?
S3 のオブジェクトの最終更新日時は 1. オブジェクト作成日(マルチパートアップロードの場合、マルチパートアップロードの開始日) と 2. 最終更新日 のいずれか遅い方です。そのため、オブジェクトをアップロードする際にマルチパートアップロードが発生すると、マルチパートアップロードが開始した時刻となります。
そのため、アップロード完了時刻をオブジェクトのタグに保存する必要があります。
aws s3 cp コマンドを使う場合は、下記のコマンドを実施ください。
$ aws s3 cp <大きいサイズのファイル> s3://<バケット名>/<オブジェクト名> && \
aws s3api put-object-tagging --bucket <バケット名> --key <オブジェクト名> --tagging "TagSet=[{Key=uploaded,Value=`date`}]"
やってみた
EC2 インスタンスを起動し、セッションマネージャーで接続します。EC2 インスタンスには S3 へのアクセス権限を追加します。
まず、1 GiB のダミーデータを作成します。
$ dd if=/dev/zero of=1G.dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.01101 s, 174 MB/s
$ ls -l
total 1024000
-rw-r--r-- 1 ssm-user ssm-user 1048576000 Jun 12 05:14 1G.dummy
当該のファイルをアップロードします。
$ aws s3 cp 1G.dummy s3://s3-last-modified-test/1G.dummy && \
aws s3api put-object-tagging --bucket s3-last-modified-test --key 1G.dummy --tagging "TagSet=[{Key=uploaded,Value=`date`}]"
upload: ./1G.dummy to s3://s3-last-modified-test/1G.dummy
ファイルの最終更新日時と uploaded タグを確認します。
$ aws s3api list-objects-v2 --bucket s3-last-modified-test --prefix 1G.dummy
{
"Contents": [
{
"LastModified": "2024-06-12T05:15:56.000Z",
"ETag": "\"80fec5b52db421a0ed6544f01a801b8d-125\"",
"StorageClass": "STANDARD",
"Key": "1G.dummy",
"Size": 1048576000
}
]
}
$ aws s3api get-object-tagging --bucket s3-last-modified-test --key 1G.dummy
{
"TagSet": [
{
"Value": "Wed Jun 12 05:16:05 UTC 2024",
"Key": "uploaded"
}
]
}
アップロード開始時刻がLast-Modified
、アップロード完了時刻がタグuploaded
として記録されたことが確認できました。
参考資料
システムで定義されたオブジェクトメタデータ - オブジェクトメタデータの使用 - Amazon Simple Storage Service
Last-Modified オブジェクト作成日または最終更新日のいずれか遅い方。マルチパートアップロードの場合、オブジェクトの作成日はマルチパートアップロードの開始日です。