BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】複数のLambdaに同条件のS3トリガーを設定したい時にハマった話

こんにちは!
BFT名古屋支店の佐野です。

突然ですが、Lambdaには他のAWSサービスで発生したイベントを検知して起動できるトリガー機能があることは御存じでしょうか。
これを利用することで、例えばAWSのストレージサービスであるS3と連携させ、管理しているストレージに何かしらファイルが配置された時にLambdaを自動で起動するといったことが可能となります。
この仕組みはAWSではS3トリガーと呼ばれており、以下の公式ドキュメントでチュートリアルが示されています。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example.html

さて、筆者はこの機能を使用して“S3のストレージ(バケット)に特定のファイルを配置した時、複数のLambdaが起動する”というトリガーを設定しようとしたのですが、想定していた通りには行かず少々ハマってしまいました。
今回はその時にハマってしまったポイントについてお話していきます。


はじめに

筆者は、以下の図のように「ふたつのLambdaに“特定のS3バケットに特定のファイルが配置された時に起動する”というS3トリガーをそれぞれ設定する」ことで、ファイルが配置された時にふたつのLambdaが同時に起動させようとしました。

f:id:bftnagoya:20211208155053p:plain
例:.jpgファイルがS3バケットに置かれた時、2つのLambdaが起動するようにしたい

しかし、ふたつめのLambdaにトリガー設定を行なおうとしたところ、以下のエラーが発生し、トリガーを設定することができませんでした。

f:id:bftnagoya:20211207170659p:plain
トリガーを設定しようとしたら発生したエラー

果して何が引っかかって、トリガーが作成できなかったのでしょうか。


まったく同じS3トリガーは作成できない

まずはエラー文をよく見てみましょう。
Google翻訳すると以下の通りとなりました。

トリガーの作成中にエラーが発生しました:
構成があいまいに定義されています。
同じイベントタイプのプレフィックスが重複している場合、2つのルールで重複するサフィックスを持つことはできません。

ここでいうイベントタイプというのは「ファイルを置いた時」など、行われた操作を指定するもの、
そしてプレフィックスというのはバケットの配下の階層の指定、サフィックスはファイル名の一部や拡張子の指定になります。
S3トリガーはこれらの指定条件すべてに合致したイベントが発生した場合に、Lambdaを起動させることができますが、
このエラーが示すところによれば、それらの指定条件が同じS3トリガーを2つ以上作成できないということになります。
すなわち、筆者が想定していた構成は仕様上不可能だったのです。

f:id:bftnagoya:20211208155029p:plain
内容が重複するトリガーは設定できない

では、どうすれば想定していた構成と同じような処理を行なわせることができるでしょうか。


Stepfunctionを利用する

同じ条件のS3トリガーが2つ作成できないなら、1つのS3トリガーでふたつのLambdaを動かせばいいじゃない!
ということでワークフローを作成できるAWSサービス“StepFunctions”を新たに取り入れ、以下のような構成を取れば、当初想定していた構成と同様の動作を取らせることができます。

f:id:bftnagoya:20211208155204p:plain
StepFunctionsを利用することで、今回想定の動作を実現する

StepFunctionsではLambdaの並列実行が可能なので、S3トリガーによって起動したLambdaによってStepFunctionsのワークフローを呼び出し、そのワークフローの処理によってLambdaが動いていくという仕様です。
こちらは一例となり、EventBridgeを併用することでLambdaが無くともS3のイベントを検知してStepFunctionsを呼び起こすことも可能です。
ただしその場合はCloudTrailにてS3のイベントログを取るようにする設定が必要となります。
有料の設定となるため、利用頻度や他にS3のイベントによって動作するリソースがあるかを鑑みて、どの方法を採用するかを検討するとよいと思います。
今回のケースでは、他にS3のイベントを検知して動くリソースが無かったため、LambdaによってStepFunctionsを呼び出す方法を採りました。


さいごに

Lambdaを起動するためのトリガーは、S3以外にも様々なAWSリソースで生じたイベントを検知させて作動させることができます。
ただ今回のように、同じ条件で作動させたいLambdaに関しては、それらをStepFunctionsでまとめるとスマートになるかと思います。

なお余談ですが、S3トリガーの制約である“同じイベントタイプでプレフィックスが重複している場合、2つのルールで重複するサフィックスを持つことはできない”という旨は、実はS3トリガーを設定する画面でも書いてあったりします。

f:id:bftnagoya:20211207170950p:plain
ひっそり書いてあるんです…

エラーで慌てる前に、しっかり画面に書いてあることを確認することが大事というのが身に染みるポイントでありました…

ということで、今回はこれまで。
また次回の記事でお会いしましょう。