0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

S3のファイルアップロードをトリガーにEventBridgeからLambdaを起動

Last updated at Posted at 2025-10-18

目的

・EventBridgeのトリガー起動・Lambda起動・ペイロード取得を学ぶ

ゴール

・S3にtest.txtファイルをアップロード

・EventBridge起動→Lambda起動

・Lambda側でファイルの中身とファイル名を取得する

設定手順

S3側設定

  1. テスト用の適用なバケットを作成し、その中にYYYYMMDD形式の日付を作成する。
    image.png

  2. バケットの「プロパティ」から「イベント通知」の設定を確認する。
      この中に「EventBridgeに通知を送信する」項目があり、これがデフォルトだとオフになっているため、オンに変更する。
    image.png

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にコードをデプロイする。

image.png

コードは下記

lambda.py
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は以下の通り

.json
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["<自分が作成したテスト用バケット名>"]
    },
    "object": {
      "key": [{
        "wildcard": "20251018/*"
      }]
    }
  }
}

このイベントパターン内では正規表現は使用できない。

"prefix": "20251018/test_*.txt"

また、prefixとsuffixは同時使用できない(なんで?)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/c901908f-02f9-4415-846d-60d1ecc3bc38.png)

みたいな書き方はできない。
そのため、Lambda側でファイル名で処理を分岐するなど工夫が必要
(まぁ、本来はEventBridgeを挟まなければいいだけの話だが)

テスト

S3の該当バケットのフォルダ内にファイルをアップロードし、EventBridgeとLambdaの実行を確認する。

アップロードするファイルの中身

スクリーンショット 2025-10-18 152225.png

EventBridgeの起動確認

EventBridgeの「モニタリング」内のMatchedEventsを確認する
起動が成功していれば1以上の値がついている

image.png

Lambdaの起動確認

CloudWatch内の該当ロググループ内のストリームを確認

image.png

バケット名、ファイル名、ファイルの中身が無事出力(取得)できている。

締め

これだとファイルをアップロードするたびにEventBridgeとLambdaが起動してしまう。
起動回数も課金対象のため、無駄な起動は避けたい。
ファイルの拡張子やファイル名で絞ったうえで起動自体を制御する方法も模索する。
調べたところ、EventBridge Pipesで精密な条件指定ができるらしい。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?