概要
- 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
-
S3は追加で作業が必要である。当該のバケットのページに移動する。
-
「プロパティ」を開く。
-
「Amazon EventBridge」の「編集」をクリックする。
-
「オン」を選択し「変更の保存」をクリックする。
lambda
-
lambdaの関数部分は一部のみ修正する。下記のコードをそのままコピペして保存 → 「Deploy」をクリックする。
node.jsimport { 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; };
-
「コード」のタブで「Test」をクリックし下記の様に設定して保存する。
項目 内容 備考 イベントアクションをテスト 新しいイベントを作成 イベント名 test-for-event-bridge イベント共有の設定 プライベート JSON 別途記載 - イベントJSON
{ "detail": { "bucket": { "name": "miriwo-test" }, "object": { "key": "test/test1.csv" } } }
-
再び「コード」のタブで「Test」の横の下三角をクリックし、「test-for-event-bridge」を選択してから「Test」クリックしテストを実行する。下記のようにtest1.csvの内容が出力されればコードは問題なく設定できている。
EventBridge
-
EvnetBridgeのページにアクセスし、サイドメニューから「イベントバス」をクリックする。
-
デフォルトイベントバスの「アクション」をクリックし「検出を開始する」に設定する。
-
デフォルトのイベントバスのスキーマの検出が「Started」になっていることを確認する。
-
EventBridgeのサイドバーの「ルール」をクリックし、「ルールを作成」をクリックする。
-
下記の情報を記載しルールを設定する。(指定の無いものは特に設定しない)
項目 内容 備考 名前 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トリガー
確認(前提記事と同じ)
-
下記のtest2.csvファイルを用意する。
test2.csvid,name 1,name_A 2,name_B 3,name_C 4,name_D
-
miriwo-testバケットのinフォルダにtest2.csvをアップロードする。
-
lambda関数のget-s3-objectのページまで移動し、「モニタリング」のタブをクリックする。更新ボタンを何回か押下して「Invocations」のグラフに実行状況がプロットされたら、「ログ」をクリックする。
-
最も新しいログストリームのリンクをクリックする。
-
下記のようにtest2.csvの内容がCloudWatchのログに出力されていれば実装できている。
-
これで「S3にファイルアップロード → アップロードイベントをEventBridgeが感知 → lambda関数を実行 → ファイルの内容をログに出力」の流れを実装する事ができた。