AWS Lambda(以下Lambda)は実行時のみ料金の発生するサーバーサービスだ。
Lambdaの便利なところはS3やSQSなどのサービスへのデータ追加や変更などのイベントをトリガーに実行させられるところにある。
例えばS3に画像がアップロードされた時にイベントトリガーとしてサムネイルを生成するLambdaを登録しておくと、バッチサーバーを立てて常時起動しておかなくてもアップロード時のみ都度処理してくれるのでコストが抑えられるとか。用途は色々。
* * * * * * *
今回は某案件にて複数のLambdaに対して1つのイベントで全て同時実行させる必要があったが少しはまったのでメモ。
自分の当初の計画ではS3にLambdaに渡したいデータの書かれたファイルがアップロードされたとき、トリガーとして対象となるLambdaを複数登録すればOkという目論見でいた。
ところがこれはうまくいかない。
例えばhoge bucketにprefixがbar、suffixが.csvのファイルをアップロードされるときイベントトリガーとしてLambdaを登録したいとする。
もちろんLambda1つであれば当然登録できる。
しかしながら、同じルールで2つめのLambdaを登録しようとすると以下のようなエラーが発生する。
There was an error creating the trigger: Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type.
要は同一bucketで同じルールのイベントトリガーとして登録できるLambdaは1つということらしい。
* * * * * * *
じゃあどうすればいいかというと、DynamoDBのストリームベースモデルのイベントを利用する。
先の例であれば、DynamoDBにLambdaに渡したいデータを挿入し、そのイベントのトリガーとしてLambdaを実行させるようにする。
このやり方だとDynamoDBへのイベントに対して複数のLambdaを紐付けることが可能なので、イベント発生->同時に複数Lambdaの同時実行が可能になる。
また、aws cliではcreate-event-source-mappingを使うことでLambdaとDynamoDBのイベント定義が可能なので設定の自動化もできる。
aws lambda create-event-source-mapping \
--event-source-arn arn:aws:dynamodb:ap-northeast-1:XXXXXXXX:table/TABLE_NAME/stream/20XX-01-01T00:00:00.000 \
--function-name arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:FUNCTION_NAME \
--starting-position TRIM_HORIZON
注意としてはテーブル単位でlambdaが紐づくので、すべてのイベント(変更や削除)でlambdaが起動する。なのでlambdaのコード側でイベントの種類によってのハンドリングをしっかり行う必要がある。
またLambdaごとにイベントの処理が成功するまで定期的にイベントが再発生するのでそのハンドリングもコード側でしないといけない。
* * * * * * *
ちなみにAWS Lambdaはデフォルトだと同一リージョンに最大100個登録することができる。
それ以上はAWSへの申請が必要。