目的
・EventBridgeのトリガー起動・Lambda起動・ペイロード取得を学ぶ
ゴール
・S3にtest.txtファイルをアップロード
↓
・EventBridge起動→Lambda起動
↓
・Lambda側でファイルの中身とファイル名を取得する
設定手順
S3側設定
Lambda側の設定
EventBridgeの作成に手戻りが発生するため、先にLambdaを作成する。
LambdaのランタイムはPython
使用するロールはS3への書き込み権限・CloudWatchLogsへの作成・書き込み権限が必要
Lambda用ロールに付与するポリシー(Json)は下記
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<バケット名>/*"
}
]
}
続いて、Lambdaにコードをデプロイする。
コードは下記
import logging
import boto3
# ロギングの設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info(f"受け取ったイベント: {event}")
try:
bucket_name = event['detail']['bucket']['name']
object_key = event['detail']['object']['key']
logger.info(f"アップロードされたバケット: {bucket_name}")
logger.info(f"アップロードされたファイル: {object_key}")
# S3からファイル名取得
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket_name, Key=object_key)
file_content = response['Body'].read().decode('utf-8')
logger.info(f"ファイルの中身: {file_content}")
return {
"statusCode": 200,
"body": f"File received: s3://{bucket_name}/{object_key}"
}
except KeyError as e:
logger.error(f"イベントデータの形式が正しくありません: {e}")
return {
"statusCode": 400,
"body": "Invalid event format"
}
except Exception as e:
logger.exception(f"予期しないエラーが発生しました: {e}")
return {
"statusCode": 500,
"body": "Internal server error"
}
左側のDeployボタンでコードを保存する。
EventBridgeからのペイロードは引数のevent内で受け取る。
logging → CloudWatchにログを出力するモジュール
INFO,WARNINGなどログレベルを指定してログを出力できるため、実用的
EventBridge側の設定
スケジュール実行と違い、トリガー実行は「ルール」から作成する。
イベントバスはdefaultを使用し、「ルールを作成」をクリックする。
2. イベントソースはAWSイベントにする。
イベントパターンのJsonは以下の通り
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["<自分が作成したテスト用バケット名>"]
},
"object": {
"key": [{
"wildcard": "20251018/*"
}]
}
}
}
このイベントパターン内では正規表現は使用できない。
"prefix": "20251018/test_*.txt"
また、prefixとsuffixは同時使用できない(なんで?)

みたいな書き方はできない。
そのため、Lambda側でファイル名で処理を分岐するなど工夫が必要
(まぁ、本来はEventBridgeを挟まなければいいだけの話だが)
テスト
S3の該当バケットのフォルダ内にファイルをアップロードし、EventBridgeとLambdaの実行を確認する。
アップロードするファイルの中身
EventBridgeの起動確認
EventBridgeの「モニタリング」内のMatchedEventsを確認する
起動が成功していれば1以上の値がついている
Lambdaの起動確認
CloudWatch内の該当ロググループ内のストリームを確認
バケット名、ファイル名、ファイルの中身が無事出力(取得)できている。
締め
これだとファイルをアップロードするたびにEventBridgeとLambdaが起動してしまう。
起動回数も課金対象のため、無駄な起動は避けたい。
ファイルの拡張子やファイル名で絞ったうえで起動自体を制御する方法も模索する。
調べたところ、EventBridge Pipesで精密な条件指定ができるらしい。。。





