概要
S3の最終更新日時を取得するLambdaをPythonで書いてみた記事です。
前提条件
- S3が用意されていること
- Lambdaに必要なIAM権限が付与されていること
環境
- ランタイム:Python3.9
- リージョン:ap-northeast-1
コード
import boto3
from datetime import datetime, timedelta, timezone
s3 = boto3.resource('s3')
s3_bucket = <S3バケット名>
bucket = s3.Bucket(s3_bucket)
def lambda_handler(event, context):
# 指定のフォルダ配下で調べたい場合はprefixを設定
prefix = '<Prefix>/'
# オブジェクトの取得
objs = bucket.meta.client.list_objects_v2(
Bucket=bucket.name,
Prefix=prefix
)
first = True
# 取得したオブジェクトを1件ずつまわす
for obj in objs['Contents']:
# 初回はdtに代入
if first:
dt = obj['LastModified']
first = False
# 2回目以降はdtより日時が遅ければ代入
else:
if dt <= obj['LastModified']:
dt = obj['LastModified']
# 日本時間に直す
jst = timezone(timedelta(hours=9), 'JST')
last_modified_time = dt.astimezone(jst)
last_modified = last_modified_time.strftime('%Y/%m/%d %H:%M:%S')
responce = {"last_modified_time": last_modified}
return responce
説明
オブジェクトを取得した時点で一番最後に入っているものが最新と思われますが、
実際、取得したオブジェクトはランダムに入っています。
そのため、for文をまわして最新日時を探す必要があります。
また、ファイルの更新に限らず、フォルダの作成など、フォルダの日時も取得します。
フォルダやファイルが多いと、それだけfor文をまわす回数が増えるので、
PrefixやSuffixで検索対象を絞ることをおすすめします。