こんばんは。小寺です。
Lambda関数の再帰ループを検出して停止できるアップデートできる機能が発表されました。
https://aws.amazon.com/about-aws/whats-new/2023/07/aws-lambda-detects-recursive-loops-lambda-functions/

アップデート内容

Lambda 関数を使ってイベント駆動型アプリケーションを使うとき、Amazon SQS や Amazon SNS などのソースからのイベント処理されることって多いですよね。
リソースを構成するときやコードのバグで、Lambda関数の処理がループに入ってしまい、Lambda破産?とよばれるような意図しない高額なコストが発生することがありました。

今回のアップデートによって、Lambda は16回の再帰呼び出しの後、Amazon SQS、AWS Lambda、Amazon SNS 間のサポートされているサービス間の再帰ループで実行されている関数が検出できるようになりました。RecursiveInvocationException を呼び出し元に返します。本アップデートの利用には追加料金はかからず利用ができます。
非同期呼び出しの場合、Lambda は配信不能キューまたは障害時の宛先 (設定されている場合) にイベントを送信します。
そのため、以前のような再帰ループの発生を避けることができるようになりました。

本アップデートでサポートされているAWSサービス

関数、Amazon SQS、Amazon SNS の間の再帰ループの検出が可能です。

サポートされているSDKバージョン

RuntimeMinimum required AWS SDK version
Node.js2.1147.0 (SDK version 2)3.105.0 (SDK version 3)
Python1.24.46 (boto3)1.27.46 (botocore)
Java 8 and Java 111.12.200 (SDK version 1)2.17.135 (SDK version 2)
Java 172.20.81
.NET3.7.293.0
Ruby3.134.0

通知はどうやって受け取れる?

Lambdaが再帰ループを停止すると、AWS Health Dashboardまたはメールから通知を受けることが可能です。
もしくは、CloudWatch メトリクスを使用して、Lambdaが停止した再帰呼び出しの数を監視することもできます。16回で停止になるので、しきい値設定位をすればOKです。

AWSヘルスダッシュボードの通知の他、Lambda が最初に関数の再帰呼び出しを停止すると、メールにアラートが送信されます。 Lambda は、AWSアカウントの関数ごとに24時間おきにMAXで1通のメールが送付されます。
注意事項としては、Lambda が再帰呼び出しを停止してから即時通知ではないです。メールでのアラートを受信するまでに最大3時間かかる場合があります。また、通知先はAWSルートアカウントだけではなく、代替連絡先にも通知が送付されます。

CoudWatchメトリクスの「RecursiveInvocationsDropped」では単一のリクエストチェーンで関数が 16 回以上呼び出されたためにLambdaが停止した関数呼び出しの数を記録します。

Lambdaの再帰ループが検出されたら

Lambda が中断した再帰ループの再発防止のために、以下を実行してみましょう。
・関数の利用可能な同時実行数をゼロに減らしてみる
・関数を呼び出しているトリガーまたはイベント ソース マッピングを削除または無効にする
・コード処理で関数を呼び出している AWS リソースにイベントを書き戻す箇所のバグを特定する
変数を使用して関数のイベント ソースとターゲットを定義するときに、両方の変数に同じ値を使用していないことを確認する

まとめ

今日は、AWS Lambda は Lambda 関数内の再帰ループを検出して停止するアップデートをご紹介しました。
本アップデートではまだ、 Dynamodb や s3 イベントなどの他のサービスではサポートされていません。対応されるとより便利になりますよね。