前回のAWS CLIでよく使うコマンドの続編として、aws s3 lsとs3api list-objects-v2の「時刻表示の違い」について書こうと思います。
同じS3のオブジェクト情報を取得するコマンドでも、時刻表示が異なります。
:----
aws s3 ls s3://bucket/path/ --recursive
----:
出力例:
:----
2025-10-17 14:30:45 1234 path/to/file.txt
----:
→ システムのローカルタイムゾーンで表示されます
→ 日本ではJST、アメリカではPST/EDTなど、実行環境によって変わります
※ タイムゾーンはシステム設定から自動的に取得されます
確認方法: date +%Z
:----
aws s3api list-objects-v2 --bucket <bucket> --prefix <path/>
----:
出力例(JSON):
:----"LastModified": "2025-10-17T05:30:45+00:00"
----:
→ 常にUTCで表示されます(+00:00がUTCを示す)
→ どの国・環境で実行しても同じ時刻が表示されます
:----
aws s3api list-objects-v2 --bucket <bucket> --prefix <path/> | jq -r '.Contents[] | . as $item | ($item.LastModified | sub("\\+00:00$"; "Z") | fromdateiso8601 + 32400 | strftime("%Y-%m-%d %H:%M:%S")) + "\t" + $item.Key'
----:
※ 32400秒 = 9時間(JSTのオフセット)
※ . as $item で元のオブジェクトを保持して、時刻とKeyの両方をタブ区切りで出力
※dateコマンドはOSによってオプションが変わって面倒なので、Pythonで時刻を変換します
:----
utc_time=$(python -c "from datetime import datetime, timezone, timedelta; jst = datetime(2025, 10, 17, 10, 0, 0, tzinfo=timezone(timedelta(hours=9))); print(jst.astimezone(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S+00:00'))")
echo $utc_time
# 出力: 2025-10-17T01:00:00+00:00
aws s3api list-objects-v2 --bucket <bucket> --prefix <path/> --query "Contents[?LastModified>='$utc_time'].[Key]" --output text
----::----
python -c "from datetime import datetime, timezone, timedelta; jst = datetime(2025, 10, 17, 10, 0, 0, tzinfo=timezone(timedelta(hours=9))); print(jst.astimezone(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S+00:00'))" | xargs -I {} aws s3api list-objects-v2 --bucket <bucket> --prefix <path/> --query "Contents[?LastModified>='{}'].[Key]" --output text
----:
キーと日時を結果に出力したい場合は、"Contents[?LastModified>='$utc_time'].[Key, LastModified]"になります。
タブ区切りで出力した結果をExcelに張り付ければセルごとにデータが反映されるので、調査する際に使うことが多いと思います。
今回はここまで。