1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS S3のobject createを感知してlambda関数を実行する(EventBridge使用)

Last updated at Posted at 2023-02-09

概要

  • S3の特定のバケットにオブジェクトがアップロード(create)されたことを感知して、そのオブジェクトの内容をconsole.logに出力するlambda関数を実行する方法をEventBridgeを使い実装してみる。

注意

  • 本作業を実施することでAWSにて料金が発生する可能性があります。
  • 料金アラートなどを予め設定し高額請求にはくれぐれもご注意ください。
  • 筆者は一切の責任を負いかねます。

前提

  • 下記記事の内容は実施済みのものとして話をすすめる。

  • 条件は上記の記事と全く同じで任意のバケット(筆者の場合miriwo-testバケット)にinフォルダを作成し、そこにファイルアップロードイベントが発生した場合lamba関数でキャッチし、ログに出力する。

準備

  • IAMロール、S3、lambdaはすでに前提の記事で設定済みのものを使用する。

    項目 内容 備考
    IAMロール名 get-s3-object-lambda-role
    S3 任意のバケットを作成しtestフォルダとinフォルダを作成 testフォルダ内には
    test1.csvを設置
    lambda関数名 get-s3-object

S3

  1. S3は追加で作業が必要である。当該のバケットのページに移動する。

  2. 「プロパティ」を開く。

    miriwo-test_-_S3_bucket.png

  3. 「Amazon EventBridge」の「編集」をクリックする。

    miriwo-test_-_S3_bucket.png

  4. 「オン」を選択し「変更の保存」をクリックする。

    miriwo-test_-_S3_bucket.png

lambda

  1. lambdaの関数部分は一部のみ修正する。下記のコードをそのままコピペして保存 → 「Deploy」をクリックする。

    node.js
    import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
    
    export const handler = async(event) => {
        
        let client = new S3Client();
        let command = new GetObjectCommand({
            Bucket: event.detail.bucket.name,
            Key: event.detail.object.key
            //Bucket: event.Records[0].s3.bucket.name,
            //Key: event.Records[0].s3.object.key
        });
    
        let object = await client.send(command);
        const body = object.Body;
        
        let fileContents = '';
        for await (const chunk of body) {
            fileContents += chunk;
        }
        
        console.log(fileContents);
    
        // TODO implement
        const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
        };
        return response;
    };
    
  2. 「コード」のタブで「Test」をクリックし下記の様に設定して保存する。

    get-s3-object_-_Lambda.png

    項目 内容 備考
    イベントアクションをテスト 新しいイベントを作成
    イベント名 test-for-event-bridge
    イベント共有の設定 プライベート
    JSON 別途記載
    • イベントJSON
    {
      "detail": {
        "bucket": { 
          "name": "miriwo-test"
        },
        "object": {
          "key": "test/test1.csv"
        }
      }
    }
    
  3. 再び「コード」のタブで「Test」の横の下三角をクリックし、「test-for-event-bridge」を選択してから「Test」クリックしテストを実行する。下記のようにtest1.csvの内容が出力されればコードは問題なく設定できている。

    get-s3-object_-_Lambda.png

EventBridge

  1. EvnetBridgeのページにアクセスし、サイドメニューから「イベントバス」をクリックする。

  2. デフォルトイベントバスの「アクション」をクリックし「検出を開始する」に設定する。

    Amazon_EventBridge.png

  3. デフォルトのイベントバスのスキーマの検出が「Started」になっていることを確認する。

    Amazon_EventBridge.png

  4. EventBridgeのサイドバーの「ルール」をクリックし、「ルールを作成」をクリックする。

    Amazon_EventBridge.png

  5. 下記の情報を記載しルールを設定する。(指定の無いものは特に設定しない)

    項目 内容 備考
    名前 get-s3-object-rule
    イベントバス default
    選択したイベントバスでルールを有効にする ON
    ルールタイプ イベントパターンを持つルール
    イベントソース AWSイベントまたはEventBridgeパートナーイベント
    作成のメソッド カスタムパターン(JSONエディタ)
    イベントパターン 別途記載
    ターゲットタイプ AWSのサービス
    ターゲットを選択 Lambda関数
    機能 get-s3-object
    • イベントパターン

      {
        "source": ["aws.s3"],
        "detail-type": ["Object Created"],
        "detail": {
          "bucket": {
            "name": ["miriwo-test"]
          },
          "object": {
            "key": [{
              "prefix": "in/"
            }]
          }
        }
      }
      

lambdaトリガー

  • すでに登録しているS3イベントトリガーを下記の方法で削除する。
    1. lambda関数のget-s3-objectを開く。

    2. 設定→トリガーとクリックし、S3を選択し「削除」をクリックする。

      get-s3-object_-_Lambda.png

確認(前提記事と同じ)

  • 下記のtest2.csvファイルを用意する。

    test2.csv
    id,name
    1,name_A
    2,name_B
    3,name_C
    4,name_D
    
  • miriwo-testバケットのinフォルダにtest2.csvをアップロードする。

  • lambda関数のget-s3-objectのページまで移動し、「モニタリング」のタブをクリックする。更新ボタンを何回か押下して「Invocations」のグラフに実行状況がプロットされたら、「ログ」をクリックする。

    get-s3-object_-_Lambda.png

  • 最も新しいログストリームのリンクをクリックする。

    get-s3-object_-_Lambda.png

  • 下記のようにtest2.csvの内容がCloudWatchのログに出力されていれば実装できている。

    CloudWatch_Management_Console.png

  • これで「S3にファイルアップロード → アップロードイベントをEventBridgeが感知 → lambda関数を実行 → ファイルの内容をログに出力」の流れを実装する事ができた。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?