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