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

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

## なにが発表されたの？
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を組んでるみんなには特に知っておいてほしいアップデートだよ！
