🕵️‍♂️

【2023/08/14アップデート】AWS CDKでLambdaのループ検知検証環境を作った上で検証してみた

2023/08/08に公開

先月に登場した、「Detecting and stopping recursive loops in AWS Lambda functions」を今更ながら試してみました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/07/aws-lambda-detects-recursive-loops-lambda-functions/

過去にLambdaでループしたことある人(私もですが)はおおっと思って、若干落胆(今後に期待したいこと参照)した機能ですが、
実際やってみると、ちゃんと止まるわーwとなりました。

仕組みの詳細等は、こちらをご覧ください。

https://aws.amazon.com/jp/blogs/compute/detecting-and-stopping-recursive-loops-in-aws-lambda-functions/

ただ、検証したみた記事だと、他の方も書かれているので、AWS CDKを使って、検証環境を構築するところからやってみました。

2023/08/14追記
注意点と記載した部分、改めて検証したところ、検知することが分かりましたので、訂正しております。

2023/08/29 追記
追加検証の件、以下に追記しました。
https://zenn.dev/keni_w/articles/ef6e8d39bb055f

AWS CDKで検証環境を構築する

こちらになります。
https://github.com/Kenichiro-Wada/aws-lambda-recursion-detection

README.md(README_jp.md)にも記載ありますが、
デプロイされるのは以下の検証環境です。

  • Amazon SQS With Dead Letter Queueでのループ
  • Amazon SQS Without Dead Letter Queueでのループ
  • Amazon SNSでのループ
  • Amazon S3でのループ(これはおまけ)

Amazon SQSで2種類あるのは、DLQの有無によって、挙動変わるかな?という確認になります。
Amazon S3に関しては、今回対象外なので、完全におまけです。
こちらは動作させると、検知および停止しないので、
放置すると永遠に動き続けますので、かならず止めるようにしてください!!!

なお、Lambda関数のコードは、ChatGPT(無課金)に質問して生成してもらいました。
Amazon CodeWhispererまだまだ使いこなせていないダメな人です。

検証

素直な感想は、お、ちゃんと16回で止まる。
最初検知だけなのかな?と思ったら、ちゃんと止まるんですね(よく読め事案)。

invokeのメトリクスでも実行数16回で止まっています。

console.logで表示しているメッセージを検索すると、
実行分、つまり16つ表示されます。

(tail機能使えばよかった)

Emailでの通知やHealth Dashboardに表示されるのは、3時間ほど後でした。
以下はHealth Dashboardの通知です。
実行時間が近いものは一緒に案内きますね。



早急に・・・という場合は、
DLQを設定して、SQSトリガーでエラー通知したり(このケースもあります)、
DLQに入ったことを検知できるようにすると早めに気づけるのかな?と思います。
※今回SQSでDLQありのケースでメール飛ばすようにしてます。(メッセージがしょぼいのはすみません)

SQSのループの場合、DLQ有無で挙動としては、変わりませんでしたが、
DLQなしのSQSのループの場合、そのまま放置しておくと、翌日以降もメールおよびHealth Dashboardで連絡が来ました。
2023/08/07に届いた2023/08/05に実行したループ処理(DLQなし)案内メールです。

DLQの有無で変わるのは興味深いです。
Queueを使うときは、DLQを用意しておくのは推奨だと思いますので、
そもそも推奨設定にもなっていない上に、ループさせるなということで、
通知が継続して出てくるのでは出ないかと推察しています。

おまけのS3トリガーですが、
動かしてみると、こんな感じ。(作った人ですが、それでも動かすときはドキドキです。)
1分ぐらいで止めたんですけどね。それでも、27回とか動いてます。

こちらは検知対象外なので、もしやってみる方は
実行したらすぐに停止させること!!!!

注意点じゃなくて大丈夫でした!

1つのSQS Quque/SNS Topicでループする場合は、今回の仕組みで検知できると思いますが、
複数QUEUEを数珠繋ぎ(ピタゴロスイッチ)する場合は、検知できないと思います(今度検証してみたいと思います。)。

サンプルはS3の例ですが、こんな感じですね。

同じQueueとかに連続で入ることで検知すると思うので、他を経由するとダメなんじゃないかな???

こちら、改めて検証したところ、SQSを数珠繋ぎにしても、ちゃんと検知して止まりました。

確かに、以下に記載の通り、SNS -> SQS -> Lambda -> SNS -> SQS ...のケースも検知するっていうことなので、
Lambda -> SQS -> Lambda -> SQS -> Lambda -> SQS ...の環境を作って検証してみたところ・・・。16回で止まる!

https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html#invocation-recursion-supported

なお、Lambdaの非同期挟むケースも含めて検証環境作って、検証したので、
別途続編として記載します。

自分の見落としで誤った情報を記載してしまいまして、申し訳ございません。

今後に期待したいこと

SQS/SNSを使った構成では、大変有効な仕組みかなと思います。
ただ、
私も過去に起こしたことありますし、
何人かにコメントもらいましたが、
Lambdaのループって以下のようなS3トリガーで起こすケースが多いと思うんですよね。

※こちらは過去に自分が起こしたことあるループのパターンです。

ということで、結論としては、
S3トリガーに実装してほしい!!!
です。
難しいのかなぁ・・・。でも期待したいです。

忘れてはならないこと

そもそもですが、
ループにならないようにする
これを忘れずにしたいと思います。
我ながら今回の検証環境を作って、動かすときには、ドキドキしてましたので。
なお、意図的にループにするようなケースはサポートケースを上げる必要があるようです。

最後に

githubに公開したサンプルで、S3トリガーのケース、
もし、試してみる方は、起動したら、絶対に即止めてくださいね!
それで課金発生したと言われても、止めないのが悪いので、当方は責任置いかねます!!!
README.md(README_jp.md)にも散々書いてます!

Discussion