2024年10月9日、「Lambda と Amazon S3 間の再帰ループを検出して停止できるようになりました」とAWSから発表がありました。
ただ、過去(2024年7月)にAWSから「AWS Lambda の再帰ループ検出機能にS3が追加されました」というタイトルでメールが届き検証してみましたが、Lambda→S3→Lambda→…間のループでは停止されませんでした。ですが、AWS What’s Newで再度発表があったので検証してみることにします。
過去に検証した際の記事はこちら。
AWS What's Newの発表内容
AWSからは以下のとおり発表がありました。
Lambda の再帰ループ検出は、AWS LambdaとAmazon Simple Storage Service (Amazon S3) 間の再帰ループを自動的に検出して停止できるようになりました。デフォルトで有効になっている Lambda の再帰ループ検出は、Lambda とその他のサポート対象サービス間の再帰呼び出しを自動的に検出して停止する予防的なガードレールであり、暴走したワークロードによる意図しない使用と課金を防止します。
お客様は通常、Amazon S3 をイベントソースとして使用して Lambda 関数をトリガーします。お客様の設定ミスやコード欠陥により、処理されたイベントが Lambda 関数を呼び出したのと同じ Amazon S3 バケットに送り返され、意図しない再帰ループが発生する可能性があります。現在、Lambda はそのような再帰ループを自動的に検出して停止し、トラブルシューティング手順を含む AWS Health Dashboard 通知をお客様に送信します。再帰ループ検出の S3 サポートは、Lambda 再帰ループ検出が利用可能なすべてのリージョンで利用できます。関数が意図的な再帰ループを使用する場合は、 PutFunctionRecursionConfig API を使用して再帰ループ検出をオフにできます。
公式ドキュメントも更新されていた
以下AWS公式ドキュメントから抜粋しています。過去の記事に更新前のドキュメントの画像と文言を記載しています。
サポートされている AWS サービス
Lambda は現在、関数、Amazon SQS、Amazon S3、Amazon SNS 間の再帰ループを検出します。Lambda は、同期的または非同期的に相互に呼び出す可能性のある Lambda 関数のみで構成されるループも検出します。次の図は、Lambda が検出できるループの例を示しています。
https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html
上記画像、文言は https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html より引用
検証:Lambda → S3 → Lambda → S3 → の構成でループを発生させる
今回は公式ドキュメントにも記載があるから前みたいにループが止まらないことはないはず!検証してみます。
過去に検証した際と同様にLambda関数で現在時刻のファイルを作成しS3へ保存する。S3イベント通知でLambda関数を呼び出すという流れで無限ループさせるような構成を作成してみました。
過去の検証結果:ループが止まらない!
300以上のファイルが短時間の内に作成されているが、何も通知されないという状態でした。
今回の検証結果:ループが止まらない!!!(泣)
なんでやぁぁぁ!どうしてループが止まらないのかわからない。
AWSから発表されている内容ではこの構成の場合、ループが止まるようになったはずなのに止まらない現象が起きています。嘘つき!(間違ってたらごめんなさい。。)
ループが止まらなかったので急いでトリガーを削除しました。
オレゴンリージョンで再度検証
リージョンを変えると無限ループが停止した
悔しかったのでオレゴンリージョンで検証したところ16個のオブジェクトが作成され、17回目の実行は止まっていました。おそらくリージョン毎で機能提供開始時期が異なっていると思われます。リージョンで使用可能か異なるなら「リージョン毎に随時更新されます」のような文言を追加しておくべきではと少し思っちゃいましたが仕方がないか。。
無限ループを検出した際に記録されるRecursiveInvocationsDroppedを確認
無限ループが検出されると「RecursiveInvocationsDropped」というメトリクスが記録されます。今回も下図のとおり確認できました。
無限ループが発生したとの通知が届いた
AWS Health Dashboard 通知
公式ドキュメントに記載のあるとおりAWS Health Dashboard 通知が届いた。
メールも届く
rootアカウントに登録しているメールアドレス宛にメールも届きました。
まとめ
Lambda → S3 → Lambda → S3 → の構成でループが発生すると16回実行された後に自動停止します。17回目は実行されません。
ただし、リージョンによって自動停止されるかどうかが異なるため注意が必要です。(2024年10月12日時点の情報)
関連記事
https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html