AWS Step Functionsを使ってS3Eventをトリガーに複数のLambdaを起動する方法
1. はじめに
株式会社トラスト、AWSソリューションアーキテクト兼AI・MLエンジニアの高宮です。
今回は、弊社のサービスである「異音検知システム」で構築する機会があったAWS StepFunctionsを使ってS3Eventをトリガーに複数のLambdaを起動する方法についてご紹介します。
2. やりたいこと
- QuickSightで異音検知の推論結果を可視化するために、以下の対応をする必要がある
- 現在の運用フローに影響を与えずに、QuickSightで推論結果を可視化
- そのために、CSVで出力している推論結果をHive形式で新しいS3に保存
3. 改修前のシステムフロー
以下実線が現状のフロー。※点線が当初イメージしていた改修(失敗したもの)。
4. 問題
上記点線の改修を行うことで、
- 現在の運用フローに影響を与えず、
- Lambda1つ(Hive形式変換用)とS3バケット1つ(Hive形式)を追加作成
が出来ると考えていましたが(以下イメージ)、
S3EventsのターゲットにHive形式変換Lambdaを追加したところ以下エラーが発生。
5. 原因
1つのS3バケットで指定条件が同じトリガーを2つ以上作成できないらしい。
6. 解決策
Event Bridge、 Step Functionsを使う。
7. やりかた
- 推論結果CSV格納バケットで、「このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信する」をONにする
- Step Functionsでステートマシンを作成する
- Amazon EventBridge でルールを作成する
1. 推論結果CSV格納バケットで、「このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信する」をONにする
2. Step Functionsでステートマシンを作成する
テンプレートでBlankを選択
表示された画面の「フロー」を選択し、
「Parallel」を「最初の状態をここにドラッグ」までドラッグ&ドロップする。
「アクション」タブからLambda Invokeを「ここに状態をドロップ」までドラッグ&ドロップする。
「Function name」で作成済みのLambda関数名を選択し、作成ボタンを押下する。
3. Amazon EventBridge でルールを作成する
ルール名を入力し、イベントバス・ルールタイプはデフォルトのまま「次へ」
ページ最下部の「イベントパターン」を編集する。
「AWSのサービス」でS3を選択し、「イベントタイプ」でS3イベント通知を選択する。
「イベントタイプの仕様」で任意・特定のイベントを選択する。(今回は特定のイベント)
設定したら「次へ」
ターゲットを先ほど作成したStep Functions ステートマシンに設定する。
レビュー画面まで次へを押下し、確認したらルールの作成を押下する。
作成後、実行履歴を確認してステータスが「成功」になっていることを確認する。
8.最後に
トラストではAI、IoTシステムのコンサル・開発を行っております。お気軽にお問い合わせください。
9. 参考文献
【AWS】Lambda関数のトリガーを同じS3にした時にハマった話 – Qiita
【AWS】複数のLambdaに同条件のS3トリガーを設定したい時にハマった話 – BFT名古屋 TECH BLOG