はじめに
今回は、2023/7/13にアップデートされたAWS Lambdaのループ検知についての検証結果をご紹介いたします。
目次
・検証するアップデート内容について
・利用サービスと準備するもの
・検証環境
・検証結果
・まとめ
検証するアップデート内容について
AWD Lambdaにおいて、アップデート前までは意図しない再帰呼び出しが発生していたが、今回のリリースにより16 回の再帰呼び出しの後、Amazon SQS、AWS Lambda、Amazon SNS 間の再帰呼び出しを停止するようになった
というのがアップデートのざっくりした内容です。
アップデート内容の詳細については、下記をご確認ください。
利用サービスと準備するもの
※構築の仕方、設定、コード等は省略
-
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を使用した環境でも検証を実施します。
①Amazon SNSでのループ処理
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
④ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
※実行した処理は起動元のトピックにメッセージを送信するlambda関数のため
②Amazon SQSでのループ処理
① lambda実行
② lambdaの処理でSQSキューにメッセージを送信
③ SQSキューに設定したエンドポイント(lambda)にメッセージを配信
④ SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
※実行した処理は起動元にキューにメッセージを送信するlambda関数のため
③Lambdaを数珠つなぎしたループ処理
※公式サイトではSQSのみ記載されているが、SNSでも検知できるか確認するためSNSを使用
① 1つ目のlambda実行
② 1つ目のlambdaの処理で2つ目のlambdaを実行
③ 2つ目のlambdaの処理でSNSトピックにメッセージを送信
④ SNSトピックに設定したエンドポイント(1つ目のlambda)にメッセージを配信
⑤ SNSトピックからのメッセージ配信をトリガーに、1つ目のlambdaを実行
⑥ ②~⑤を繰り返す
※実行した2つ目の処理は1つ目のlambda関数のトリガーであるトピックにメッセージを送信するlambda関数のため
④Amazon SNSからAmazon SQSのループ処理
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③SNSトピックに設定したエンドポイント(SQS)にメッセージを配信
④SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
※実行した処理は起動元にトピックにメッセージを送信するlambda関数のため
⑤AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン内にある構成)
① ステートマシンを実行
② 1つ目の処理であるSNSトピックの通知処理実行
③ 2つ目の処理であるlambda関数が①のステートマシンを実行
④ ①~③を繰り返す
⑥AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン外にある構成)
① ステートマシン外のlambdaを実行
② lambdaの処理でステートマシンを起動
③ ステートマシン内のlambdaの処理でSNSトピックにメッセージを送信
④ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
⑤ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑥ ②~⑤を繰り返す
検証結果
結果の概要
結果として、検証した環境のうち「⑤AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン内にある構成)」以外では適切にループ処理の停止が行われていることを確認
できました。
詳細な結果は下記でそれぞれ記載いたします。
※適切に16回で処理が停止した場合のエビデンス画面は、それぞれに大きな相違がないため、②~④・⑥のエビデンスは一部を除き、省略致します。
①Amazon SNSでのループ処理
・想定通り16回の呼び出しでループ処理が停止していることを確認
※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
※Recursive invocations dropped(ラムダ再帰ループ検出)のメトリクス画面
⇒再帰ループが、実行回数(1回)と同じ回数検出されている
※アラート(メール)の受信
⇒「再帰呼び出しを検出したため、呼び出しを停止した」という旨のアラートメールが来ている
⇒アラート(メール)を受信するまでには最大3時間かかる(今回の検証だと3時間弱かかっている)
※AWS Health Dashboardのイベントログ
⇒Description(説明)の部分に「再帰呼び出しを検出したため、呼び出しを停止した」という旨の記載がある
AWS Lambda は、AWS アカウント内の 1 つ以上の Lambda 関数が、他の AWS リソースとの再帰ループで呼び出されていることを検出しました。予期しない料金が AWS アカウントに請求されるのを防ぐために、Lambda は [影響を受けるリソース] タブにリストされている再帰的な呼び出しを停止しました。
⇒イベントログに通知が表示されるまでには最大3時間かかる(今回の検証だと3時間弱かかっている)
②Amazon SQSでのループ処理
・想定通り16回の呼び出しでループ処理が停止していることを確認
※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
※他エビデンスは①のキャプチャと大きな相違がないため省略
③Lambdaを数珠つなぎしたループ処理
・想定通り16回の呼び出しでループ処理が停止していることを確認
※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
※他エビデンスは①のキャプチャと大きな相違がないため省略
④Amazon SNSからAmazon SQSのループ処理
・想定通り16回の呼び出しでループ処理が停止していることを確認
※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
※他エビデンスは①のキャプチャと大きな相違がないため省略
⑤AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン内にある構成)
・16回の呼び出しでループ処理が停止せず、無限ループが発生した
※無限ループするためlambdaの同時実行数を0にする又はlambda関数削除を忘れずに
⇒ステートマシンの中で順番どおり動いているだけなので、SNSとLambdaの繋がりを検知できないためループが検知されなかったと推測
⑥AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン外にある構成)
・16回の呼び出しでループ処理が停止していることを確認
⇒lambdaとSNSがトリガーで繋がっているのでループを検知できたと推測
※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
※他エビデンスは①のキャプチャと大きな相違がないため省略
まとめ
Lambda、SNS、SQSが直接接続されている部分はループ処理が停止するが、Step Functions等、別サービスを挟むと止まらない可能性があるため、注意が必要
別サービスを挟んだ検証をする場合は、無限ループの対応策として、lambdaの同時実行数を0にする、又はlambda関数削除を忘れずに
おわりに
今回はAWS Lambdaのアップデート検証結果をご紹介いたしました。
「気付かぬ間に再帰呼び出しが繰り返されていて真っ青」となることがなくなるので、よくLambdaを利用する方にとっては、嬉しいアップデートですね。
ただし、今回のアップデートで再帰呼び出しの停止が行われるようになったのは、SNS・SQSのみですので、他サービスを利用した処理作成の際はお気を付けください。
参考
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください:
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area