AWS Lambdaのループ検知検証

# はじめに
今回は、2023/7/13にアップデートされたAWS Lambdaのループ検知についての検証結果をご紹介いたします。

# 目次
・検証するアップデート内容について
・利用サービスと準備するもの
・検証環境
・検証結果
・まとめ

# 検証するアップデート内容について
``AWD Lambdaにおいて、アップデート前までは意図しない再帰呼び出しが発生していたが、今回のリリースにより16 回の再帰呼び出しの後、Amazon SQS、AWS Lambda、Amazon SNS 間の再帰呼び出しを停止するようになった``というのがアップデートのざっくりした内容です。

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

アップデート内容の詳細については、下記をご確認ください。

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


# 利用サービスと準備するもの
※構築の仕方、設定、コード等は省略
- Lambda
　Lambda関数×8（各検証分）

- SNS
　トピック×6（各検証分）

- SQS
　キュー×2（②④）

- Step Functions
　ステートマシン×1（⑤⑥）

- IAM
　IAMロール×1（ポリシー、エンティティを参考で載せます）
　＜ポリシー＞
　　AWSLambda_FullAccess
　　AWSLambdaSQSQueueExecutionRole
　　AWSLambdaBasicExecutionRole
　　AmazonSNSFullAccess
　　AmazonSQSFullAccess
　　AWSStepFunctionsFullAccess

　＜信頼されたエンティティ＞
　　lambda.amazonaws.com
　　states.amazonaws.com

# 検証環境について
①～④では、AWS公式に記載されている環境をそれぞれ作成します。
また、公式に記載がある環境以外で、⑤⑥としてAWS Step Functionsを使用した環境でも検証を実施します。

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

#### ①Amazon SNSでのループ処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/0072aa88-aa1a-5c92-11f0-5385f527b6a1.png)
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
④ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑤ ②～④を繰り返す
　 ※実行した処理は起動元のトピックにメッセージを送信するlambda関数のため

#### ②Amazon SQSでのループ処理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/116e6aed-16ea-eb56-87a7-7986882efe63.png)
① lambda実行
② lambdaの処理でSQSキューにメッセージを送信
③ SQSキューに設定したエンドポイント(lambda)にメッセージを配信
④ SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②～④を繰り返す
　 ※実行した処理は起動元にキューにメッセージを送信するlambda関数のため

#### ③Lambdaを数珠つなぎしたループ処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/5c9273ba-f6fc-e510-ca2a-f2ed1e12ca02.png)
※公式サイトではSQSのみ記載されているが、SNSでも検知できるか確認するためSNSを使用

① １つ目のlambda実行
② １つ目のlambdaの処理で２つ目のlambdaを実行
③ ２つ目のlambdaの処理でSNSトピックにメッセージを送信
④ SNSトピックに設定したエンドポイント(１つ目のlambda)にメッセージを配信
⑤ SNSトピックからのメッセージ配信をトリガーに、１つ目のlambdaを実行
⑥ ②～⑤を繰り返す
 　※実行した2つ目の処理は1つ目のlambda関数のトリガーであるトピックにメッセージを送信するlambda関数のため

#### ④Amazon SNSからAmazon SQSのループ処理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/ba26ac6c-3062-cb16-32ce-7fd33cb166f3.png)
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③SNSトピックに設定したエンドポイント(SQS)にメッセージを配信
④SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②～④を繰り返す
　 ※実行した処理は起動元にトピックにメッセージを送信するlambda関数のため

#### ⑤AWS Step Functionsを使ったループ処理（SNS⇒Lambdaがステートマシン内にある構成）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777457/2bfa7990-5ae1-5058-9d6a-da4899fd973e.png)
① ステートマシンを実行
② １つ目の処理であるSNSトピックの通知処理実行
③ ２つ目の処理であるlambda関数が①のステートマシンを実行
④ ①～③を繰り返す

#### ⑥AWS Step Functionsを使ったループ処理（SNS⇒Lambdaがステートマシン外にある構成）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777457/5af1d88c-670a-d755-db6f-f6269624ff12.png)
① ステートマシン外のlambdaを実行
② lambdaの処理でステートマシンを起動
③ ステートマシン内のlambdaの処理でSNSトピックにメッセージを送信
④ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
⑤ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑥ ②~⑤を繰り返す

# 検証結果
### 結果の概要
結果として、検証した環境のうち``「⑤AWS Step Functionsを使ったループ処理（SNS⇒Lambdaがステートマシン内にある構成）」以外では適切にループ処理の停止が行われていることを確認``できました。

詳細な結果は下記でそれぞれ記載いたします。
※適切に16回で処理が停止した場合のエビデンス画面は、それぞれに大きな相違がないため、②～④・⑥のエビデンスは一部を除き、省略致します。

#### ①Amazon SNSでのループ処理
**・想定通り16回の呼び出しでループ処理が停止していることを確認**

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/740cc951-b3c5-5ba0-dc9b-726fd8315bfa.png)

※Recursive invocations dropped(ラムダ再帰ループ検出)のメトリクス画面
⇒再帰ループが、実行回数（1回）と同じ回数検出されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/edcf53c8-b441-ef30-6876-a96adeee85a1.png)

※アラート(メール)の受信
⇒「再帰呼び出しを検出したため、呼び出しを停止した」という旨のアラートメールが来ている
⇒アラート(メール)を受信するまでには最大3時間かかる(今回の検証だと3時間弱かかっている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/9075c67d-a425-8d68-6477-76f2f687007e.png)

※AWS Health Dashboardのイベントログ
⇒Description(説明)の部分に「再帰呼び出しを検出したため、呼び出しを停止した」という旨の記載がある
`AWS Lambda は、AWS アカウント内の 1 つ以上の Lambda 関数が、他の AWS リソースとの再帰ループで呼び出されていることを検出しました。予期しない料金が AWS アカウントに請求されるのを防ぐために、Lambda は [影響を受けるリソース] タブにリストされている再帰的な呼び出しを停止しました。`
⇒イベントログに通知が表示されるまでには最大3時間かかる(今回の検証だと3時間弱かかっている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/4d62ce90-8dc1-277c-daff-a851f89f0859.png)

#### ②Amazon SQSでのループ処理
**・想定通り16回の呼び出しでループ処理が停止していることを確認**

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/c047bf72-96a3-ed02-f86c-df46d680ca7a.png)
※他エビデンスは①のキャプチャと大きな相違がないため省略

#### ③Lambdaを数珠つなぎしたループ処理
**・想定通り16回の呼び出しでループ処理が停止していることを確認**

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/8addb1b9-7d95-6a64-f241-4f38e7a12a4e.png)
※他エビデンスは①のキャプチャと大きな相違がないため省略

#### ④Amazon SNSからAmazon SQSのループ処理
**・想定通り16回の呼び出しでループ処理が停止していることを確認**

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/829a8854-9d0d-f15b-1067-438d89570e4e.png)
※他エビデンスは①のキャプチャと大きな相違がないため省略

#### ⑤AWS Step Functionsを使ったループ処理（SNS⇒Lambdaがステートマシン内にある構成）
**・16回の呼び出しでループ処理が停止せず、無限ループが発生した**
※無限ループするためlambdaの同時実行数を0にする又はlambda関数削除を忘れずに
⇒ステートマシンの中で順番どおり動いているだけなので、SNSとLambdaの繋がりを検知できないためループが検知されなかったと推測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777457/30c86ace-75a4-7d81-dbf7-f3de7b1f35b4.png)

#### ⑥AWS Step Functionsを使ったループ処理（SNS⇒Lambdaがステートマシン外にある構成）
**・16回の呼び出しでループ処理が停止していることを確認**
⇒lambdaとSNSがトリガーで繋がっているのでループを検知できたと推測

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777457/ca7dd9a4-3703-5a6f-c3e1-e309bb583f33.png)
※他エビデンスは①のキャプチャと大きな相違がないため省略

# まとめ
**Lambda、SNS、SQSが直接接続されている部分はループ処理が停止するが、Step Functions等、別サービスを挟むと止まらない可能性があるため、注意が必要**

:::note warn
別サービスを挟んだ検証をする場合は、無限ループの対応策として、lambdaの同時実行数を0にする、又はlambda関数削除を忘れずに
:::

# おわりに
今回はAWS Lambdaのアップデート検証結果をご紹介いたしました。
「気付かぬ間に再帰呼び出しが繰り返されていて真っ青」となることがなくなるので、よくLambdaを利用する方にとっては、嬉しいアップデートですね。
ただし、今回のアップデートで再帰呼び出しの停止が行われるようになったのは、SNS・SQSのみですので、他サービスを利用した処理作成の際はお気を付けください。

# 参考


https://dev.classmethod.jp/articles/detecting-and-stopping-recursive-loops-in-aws-lambda-functions/

---------------------------------------
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area