S3バケットのファイルを指定した期間外分だけ出力
S3バケットに入れているファイルをライフサイクルルールにて改廃するときに、実際に改廃が発動しているのかどうかを確認するために、S3バケット上のログを指定した日数以前のものだけ出力したいケースがあった。標準のawscliだけだと、期間指定する方法が見当たらなかったため、Pythonスクリプトを組んでみた。タイムスタンプはデフォルトのままだとUTC時間で出てきてしまうため、JST時間で出るように手を加えている。
# !/usr/bin/python
import boto3
import sys
import datetime
args = sys.argv
bucket_name=args[1]
expired_day=int(args[2])
timestamp_now=datetime.datetime.now()
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
for obj_summary in bucket.objects.all():
dt=obj_summary.last_modified.strftime("%Y-%m-%d %H:%M:%S")
dp=datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S")
timestamp_put=dp + datetime.timedelta(hours=9)
timestamp_del=timestamp_now - datetime.timedelta(days=expired_day)
if timestamp_put < timestamp_del:
print (str(timestamp_put),"s3://" + bucket_name + "/" + obj_summary.key)
# !/usr/bin/python
import boto3
import sys
import datetime
args = sys.argv
bucket_name=args[1]
prefix=args[2]
expired_day=int(args[3])
timestamp_now=datetime.datetime.now()
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
for obj_summary in bucket.objects.filter(Prefix=prefix):
dt=obj_summary.last_modified.strftime("%Y-%m-%d %H:%M:%S")
dp=datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S")
timestamp_put=dp + datetime.timedelta(hours=9)
timestamp_del=timestamp_now - datetime.timedelta(days=expired_day)
if timestamp_put < timestamp_del:
print (str(timestamp_put),"s3://" + bucket_name + "/" + obj_summary.key)
S3ライフサイクルルールの発動タイミング
マニュアルによると下記のため、発動タイミングの算出基準は毎日UTC0時(日本時間9時)の模様。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/intro-lifecycle-rules.html
ライフサイクルルール: オブジェクトの存在時間に基づく
Amazon S3 がアクションを実行できる期間を、そのオブジェクトの作成 (または変更) からの日数で指定できます。
日数をライフサイクル設定の Transition アクションおよび Expiration アクションで指定する場合は、以下の点に注意してください。
アクションが実行される、オブジェクト作成からの日数です。
Amazon S3 は、ルールに指定された日数をオブジェクトの作成時間に加算し、得られた日時を翌日の午前 00:00 UTC (協定世界時) に丸めることで、時間を算出します。たとえば、あるオブジェクトが 2014 年 1 月 15 日午前 10 時 30 分 (UTC) に作成され、移行ルールに 3 日と指定した場合、オブジェクトの移行日は 2014 年 1 月 19 日 0 時 0 分 (UTC) となります。