🕵️‍♂️

Lambdaのループ検知がS3トリガーでのLoopに対応したので試してみる

に公開

2023年に登場した、LambdaのLoopの検知および停止について、
2024年10月に待望(・・・だと思うんですが)のS3トリガーでのLoop検知および停止に対応しました!

https://aws.amazon.com/jp/about-aws/whats-new/2024/10/aws-lambda-detects-stops-recursive-loops-lambda-s3/

2023年のアップデートの際には、以下の2記事にて、検証記事を書きました。
その続きというか、
その当時は検知および停止の対象ではなく、
今後にアップデートしてくれると嬉しいなと書いたS3トリガーでのLoopについて、アップデートを受けて、改めて検証しました。(2ヶ月遅れ・・・すみません)
過去記事もあとでアップデートしておきます。

https://zenn.dev/keni_w/articles/acbfd69a2c7dbb

https://zenn.dev/keni_w/articles/ef6e8d39bb055f

検証用のLambdaのランタイムとかは、前回作ったものを使っています。

https://github.com/Kenichiro-Wada/aws-lambda-recursion-detection

そのままで動くは動くんですが、以下対応してます。

  • 各種モジュールのアップデート、
  • Node.jsランタイムのバージョンアップ(v18 -> v22)
  • 内部処理で5秒のwait追加(速攻で止まっちゃうので)
  • READMEの更新(検知および停止する旨記載)

S3トリガーでのLoop検知および通知の検証

改めて、検知の検証をしたのは以下の構成です。
問題ないよね?っていうのを確認するために、他の検知パターンも確認しましたが、
特に挙動変わっていないので、割愛します。気になる方は以前の記事をご覧ください。

結果は・・・ ちゃんと止まるぞ (いや止まらないと困るんですがw)

メトリクス上も16回実行されています。

なお、対応前は、以下のような感じでした。※以前検証時のものです。

Cloudwatch LogsでLambda内で出しているメッセージで検索かけたところ、16件出てきたので、
16回の実行で抑えられていることがわかります。

検知および停止のメトリクスとして「Recursive invocations dropped」があり、
停止が1回記録されています。

AWS Health Dashboard上でも従来通り通知が表示されます。

追加検証必要なこと

今回のループのケースでは、通知させるフローがないので、
LambdaにDLQ設定すれば通知できると思うので、ちょっとフローを変えたバージョンを試してみようと思います。
あと、
S3とSQSとかを組み合わせた場合どうなるかも追加で検証して記事アップデートしようと思います。

忘れてはならないこと(毎回書いていますが)

待望のS3トリガーへの実装ですが、
以前書いた記事にも記載しましたが、
実装されたからと言って、それに甘えるのではなく、
そもそも
ループにならないようにする
これを忘れずにしたいと思います。
S3対応で、個人的には無限ループしそうなケースは全て対応されたんじゃないかと思うのですが、
やはりそもそもループさせないようにするのが一番大事だと思います。

意図的にループにする場合・・・。

意図的にループさせるケースの場合は、16回で止まってしまうと問題になってしまうので、
その場合は、PutFunctionRecursionConfig APIを使って無効にできるようです。
(以前はサポートケースを上げるだったと思いますが・・・。)
ちょっと後日やってみようかなぁ・・・

終わり

あくまで検知&停止はガードレールだと思います(ご案内にもその旨書いてあります)。
上記もしましたが、意図しない限りはそもそもループにならないようにするってのが重要だと思いますし、そうならないに気をつけたいと思います。

Discussion