LoginSignup
2
0

AWS Lambdaのループ検知検証

Last updated at Posted at 2023-09-06

はじめに

今回は、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でのループ処理

image.png
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
④ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
  ※実行した処理は起動元のトピックにメッセージを送信するlambda関数のため

②Amazon SQSでのループ処理

image.png
① lambda実行
② lambdaの処理でSQSキューにメッセージを送信
③ SQSキューに設定したエンドポイント(lambda)にメッセージを配信
④ SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
  ※実行した処理は起動元にキューにメッセージを送信するlambda関数のため

③Lambdaを数珠つなぎしたループ処理

image.png
※公式サイトでは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のループ処理

image.png
① lambda実行
② lambdaの処理でSNSトピックにメッセージを送信
③SNSトピックに設定したエンドポイント(SQS)にメッセージを配信
④SQSのメッセージ受信をトリガーに、lambdaを実行
⑤ ②~④を繰り返す
  ※実行した処理は起動元にトピックにメッセージを送信するlambda関数のため

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

image.png
① ステートマシンを実行
② 1つ目の処理であるSNSトピックの通知処理実行
③ 2つ目の処理であるlambda関数が①のステートマシンを実行
④ ①~③を繰り返す

⑥AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン外にある構成)

image.png
① ステートマシン外のlambdaを実行
② lambdaの処理でステートマシンを起動
③ ステートマシン内のlambdaの処理でSNSトピックにメッセージを送信
④ SNSトピックに設定したエンドポイント(lambda)にメッセージを配信
⑤ SNSトピックからのメッセージ配信をトリガーに、lambdaを実行
⑥ ②~⑤を繰り返す

検証結果

結果の概要

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

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

①Amazon SNSでのループ処理

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

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
image.png

※Recursive invocations dropped(ラムダ再帰ループ検出)のメトリクス画面
⇒再帰ループが、実行回数(1回)と同じ回数検出されている
image.png

※アラート(メール)の受信
⇒「再帰呼び出しを検出したため、呼び出しを停止した」という旨のアラートメールが来ている
⇒アラート(メール)を受信するまでには最大3時間かかる(今回の検証だと3時間弱かかっている)
image.png

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

②Amazon SQSでのループ処理

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

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
image.png
※他エビデンスは①のキャプチャと大きな相違がないため省略

③Lambdaを数珠つなぎしたループ処理

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

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
image.png
※他エビデンスは①のキャプチャと大きな相違がないため省略

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

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

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
image.png
※他エビデンスは①のキャプチャと大きな相違がないため省略

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

・16回の呼び出しでループ処理が停止せず、無限ループが発生した
※無限ループするためlambdaの同時実行数を0にする又はlambda関数削除を忘れずに
⇒ステートマシンの中で順番どおり動いているだけなので、SNSとLambdaの繋がりを検知できないためループが検知されなかったと推測
image.png

⑥AWS Step Functionsを使ったループ処理(SNS⇒Lambdaがステートマシン外にある構成)

・16回の呼び出しでループ処理が停止していることを確認
⇒lambdaとSNSがトリガーで繋がっているのでループを検知できたと推測

※Invocations(呼び出し)のメトリクス画面
⇒呼び出し回数が16回で停止している
image.png
※他エビデンスは①のキャプチャと大きな相違がないため省略

まとめ

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0