Amplify Lambdaのトリガーでミスした件
はじめに
Amplify CLIでS3にLambdaトリガーを設定した際に、トリガーが永続的に発火しLambdaの請求額が上がってしまったので再発防止+覚えておくように書きます。
概要
AWS Amplifyで開発をしています。以下に簡単な概要を記述します。
クライアントは、ある特定のファイルをAmplifyで作ったStorage(S3)にプットします。それと同時にAPIでDynamoDBにレコードを挿入します。
この際にS3にプットされたファイルオブジェクトが正しいデータが否かを確認するためにLambdaトリガーをAmplifyで設定します。
このLambdaはDynamoDBにそのファイルのデータがあるかを確認し、あればそのままファイルをS3に保存し、ない場合はそのS3オブジェクトを削除するというものです。
ループまで
Amplify cli で storageにトリガーを設定し、プッシュしました。
$ amplify update storage
Select from one of the below mentioned services: Content (Images, audio, video, etc.)
Do you want to add a Lambda Trigger for your S3 Bucket? (y/N) · yes
Select from the following options · Choose an existing function from the project
Select from the following options · LambdaTrigger
$ amplify push
上記設定で LambdaTrigger
というLambdaがS3のトリガー設定に反映されます。
そしてそれをAWSに反映させるため、 amplify push
を実行しました。
しかしこれが問題でした。
このAmplify cli の設定ではLambdaのトリガーがput時とremove時の両方に設定されるようです。
自分はこれを知らずにそのままで大丈夫かと思っていました。
そんなことを知らずにこのLambdaトリガーのテストを実行します。
まずはDynamoDBにレコードを追加し、S3にデータをプットします。
これはちゃんとした動作をし、Lambdaトリガーが発火しましたが、DynamoDBにレコードが存在するのでS3オブジェクトは正常に動作しました。
ここから事件が
次にDynamoDB側に何も設定しないで、S3にデータをプッシュします。
するとLambdaトリガーが発火し今度はDynamoDBにレコードは存在しないので、S3オブジェクトはLambdaによって削除されます。
簡単なテストを実行確認したのにち自分の中で正常お通りに動いていると認識し、とりあえずそのままで次の作業を進めました。
少し時間がたってから料金がやばいことになっているという連絡がありました。
どうやらLambdaの実行回数が大変なことになっているということです。
最初は何のことかわかりませんでしたが、Lambdaの設定にS3オブジェクトを置いたときと削除したときにLambdaトリガーが発火する事を知りました。
その設定のため、
正規ではないデータが挿入される => 削除する => 削除したのでLambdaトリガー実行 => レコードが見つからないのでデータの削除 => 削除したので、、、
がループするという形になっていました。
どうして、S3にオブジェクトが存在しないにも関わらずLambdaがループしたのかは恐らくLambdaのソースコードの書き方が悪く、S3オブジェクトの有無に関わらず削除の実行をしていたからだと思います。
反省点
反省点として
- Amplify cli でStorage Trigger の仕様を理解していなかった(確認していなかった)。
- Lambdaののソースコードの自体の書き方が良くなかった。
- そもそもS3の設定をamplifyだけしか確認しなかった。
などが挙げられます。
Amplify cliではそもそもput時とremove時の設定を分けることができないようなので、例えばLambda側でアクションで分岐したり、AWSコンソールでremove時はしないように変更したり、CDKで設定をしたりなど様々な方法があったかと思います。