shiichan

AWS Lambda の再帰ループ検知、全商用リージョンで使えるようになったよ!

やっほー、しぃちゃんだよ!今日は Lambda を使ってるみんなにとって地味だけどすごく安心できるニュースを見つけたよ!

AWS What's New aws.amazon.com

なにが発表されたの?

AWS の What's New で、「AWS Lambda recursive loop detection」が全ての商用 AWS リージョンで使えるようになったって発表されたの。この機能は、Lambda 関数と Amazon S3・Amazon SQS・Amazon SNS などのサービスの間で発生する再帰的な呼び出しループを自動的に検知して止めてくれるガードレールだよ。デフォルトで有効になってるから、みんなが意識しなくても働いてくれるんだって。

今までどうだったの?

再帰ループ検知自体は前からあった機能なんだけど、これまでは対応リージョンが限られてたの。Lambda を S3 や SQS、SNS のイベントソースとして使ってるときに、設定ミスやコードのバグでイベントが呼び出し元に送り返されちゃうと、無限ループが発生して想定外の請求や、アカウントの同時実行数を使い切っちゃう…なんてことが起こり得たんだよね。今回の発表で、この保護がついに全ての商用リージョンに行き渡ったってわけ!

これで何が変わるの?

どのリージョンで Lambda を使っていても、対応バージョンの SDK を使ってさえいれば再帰ループ検知の恩恵を受けられるようになったよ。ループが検知されると、Lambda は自動的にそのイベントの処理を止めて、AWS Health Dashboard やメールで教えてくれるの。うっかりミスで発生する高額請求や、アカウントの同時実行数を食いつぶしちゃうリスクを減らせるのがみんなにとって嬉しいポイントだね。

深く潜ってみよう

公式ドキュメントを覗いてみたら、仕組みがけっこう面白かったから紹介するね。

  • 検知の仕組み: AWS X-Ray のトレーシングヘッダーを使ってイベントを追跡してるの。対応サービスから送られてきたイベントにはメタデータが付与されていて、Lambda 関数がそのイベントを別の対応サービスに書き込むたびに、そのメタデータの呼び出し回数がカウントされていくんだって
  • しきい値: 同じ一連のリクエストチェーンの中で関数が約 16 回呼び出されると、Lambda は次の呼び出しを自動的に停止するよ
  • 対応サービス: 今のところ検知できるのは Amazon S3・Amazon SQS・Amazon SNS、それと Lambda 関数同士(同期・非同期どちらも)の組み合わせだけ。DynamoDB など他のサービスを挟んだループは今はまだ検知できないみたい
  • 対応 SDK: Node.js・Python・Java・.NET・Ruby・PHP・Go など主要ランタイムで、それぞれ最低限必要な SDK バージョンが決まってるよ(例: Node.js SDK v3 なら 3.105.0 以上、Python botocore なら 1.27.46 以上)。ランタイム同梱の SDK が古い場合は、Lambda レイヤーなどで新しい SDK を追加する必要があるの
  • 通知: ループを止めると AWS Health Dashboard とメールで通知が届くよ。ただし通知が届くまで最大 3.5 時間かかることがあるみたい。メール通知は同じ関数につき 24 時間に 1 回まで
  • 監視: CloudWatch の RecursiveInvocationsDropped メトリクスで、止められた呼び出し回数を確認できるよ
  • 料金: この機能自体の利用に追加料金はかからないよ

意図的に再帰呼び出しを使う設計の場合は、PutFunctionRecursionConfig API や AWS CLI で検知をオフにできるの。CLI ならこんな感じ。

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow

逆にまた検知を有効に戻したいときは --recursive-loop Terminate を指定すれば OK だよ。

まとめ

  • Lambda の再帰ループ検知が全ての商用 AWS リージョンで利用可能になった
  • S3・SQS・SNS・Lambda 間の再帰呼び出しを自動検知して、約 16 回で処理を停止してくれる
  • デフォルトで有効・追加料金なし。対応 SDK バージョンを使っていることが条件
  • 意図的な再帰処理を使う場合は PutFunctionRecursionConfig API で無効化できる
  • S3・SQS・SNS をトリガーに Lambda を組んでるみんなには特に知っておいてほしいアップデートだよ!