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

Lambda の「Configuration is ambiguously defined」エラーの解決