
はじめに
ゼネットシステム事業部の方です。
AWSを利用していると、S3に大量のファイルが溜まっていき、整理や管理が大変になることがあります。
手動で整理するのは手間がかかり、ミスも発生しやすくなります。
本記事では、S3イベント通知をトリガーにLambda関数を動かしてファイルを自動整理する方法を紹介します。
IAM権限やバケットポリシーを最小限にしつつ、日付ごとにフォルダに振り分ける例で解説します。
課題
S3運用でよくある課題は以下です:
-
ファイルが増え続けて整理が大変
-
日付ごとに自動で分類したい
-
一定期間経過したファイルを自動削除したい
-
手動操作によるヒューマンエラーを防ぎたい
これらの課題は、Lambda + S3イベント通知 + CloudWatch Logs を組み合わせることで解決できます。
実装アーキテクチャ
-
ユーザが S3 バケットにファイルをアップロード
-
ObjectCreatedイベントをトリガーに Lambda 関数が起動 -
Lambda がファイルを日付フォルダ(例:
2025/10/16/)に整理(コピー+削除) -
CloudWatch Logs に処理状況を出力

実装手順
1. S3バケット作成
まず、アップロード先となる S3 バケットを作成します。
例では test-hou というバケット名を使用します。

2. Lambda関数作成
- Lambda コンソールで新しい関数を作成します。
-
-
-
ランタイム: Python 3.13
-
実行ロール: 後述のIAMポリシーを付与したロールを使用
-
-
- Lambdaの一般設定で「タイムアウト」を1分程度に変更してください(ファイル操作に余裕を持たせるため)。

Lambda一般設定-タイムアウト - 以下のコードをデプロイします。
import boto3 import os from datetime import datetime, timezone s3 = boto3.client('s3') def lambda_handler(event, context): # S3イベントからバケット名とファイルキーを取得 bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print(f"イベント受信: {event}") # オブジェクトの最終更新日を取得 response = s3.head_object(Bucket=bucket, Key=key) last_modified = response['LastModified'].astimezone(timezone.utc).date() today = datetime.now(timezone.utc).date() print(f"ファイル更新日: {last_modified}, 本日の日付: {today}") # 日付フォルダへ移動 folder_path = today.strftime('%Y/%m/%d') new_key = f"{folder_path}/{os.path.basename(key)}" # ファイルをコピーして元ファイルを削除 s3.copy_object(Bucket=bucket, CopySource={'Bucket': bucket, 'Key': key}, Key=new_key) s3.delete_object(Bucket=bucket, Key=key) print(f"✅ 整理完了: {key} → {new_key}")
3. トリガー設定(S3イベント通知)
Lambda関数の設定画面から、トリガーを追加します。
トリガータイプに S3 を選択し、以下のように設定します。
-
イベントタイプ:
All object create events(すべてのオブジェクト作成イベント) -
プレフィックス・サフィックス:全ファイル対象の場合は指定しない




設定を保存すると、「トリガーが正常に追加されました」と表示されます。