LoginSignup
32
17

More than 5 years have passed since last update.

SQSをイベントソースとするLambdaで同時実行数の制限によりSQSメッセージが処理されなかった場合でもSQSメッセージの受信数はカウントされる

Last updated at Posted at 2018-07-13

背景

やりたいこと

以下のようなアーキテクチャが実現できるか考えてみました。

a.png

  • SQSキューにメッセージが送信されたらLambdaを起動したい。
  • LambdaはDynamoDBにアクセスする。
  • DynamoDBのキャパシティユニットを一定に抑えるためにLambdaの同時実行数を制限したい。
  • 同時実行数の制限によって処理されなかったSQSメッセージは元のSQSキューに戻し、Lambdaの同時実行数が減ったら改めて処理したい。
  • プログラムのエラーによりLambdaで処理できなかったSQSメッセージはデッドレターキューに転送したい。

関係するLambdaの機能

このアーキテクチャの実現にLambdaの以下の機能が利用できます。

Lambdaの関数レベルの同時実行数の管理

LambdaのイベントソースとしてSQSを使う

先日、AWS LambdaでSQSをイベントソースとしてサポートすることが発表されました。

詳しくはクラスメソッドさんの記事を参照してください。

疑問

同時実行数の制限によってLambdaの起動に失敗した場合、トリガーとなったSQSメッセージの受信数はカウントされてしまうのでしょうか。

もしそうなら

  • プログラムのエラーによりLambdaで処理できなかったSQSメッセージはデッドレターキューに転送したい。

の要件でデッドレターキューを設定しているため、同時実行数の制限によるLambdaの起動失敗を繰り返した結果、SQSメッセージがデッドレターキューに転送されることが考えられます。よって

  • 同時実行数の制限によって処理されなかったSQSメッセージは元のSQSキューに戻し、Lambdaの同時実行数が減ったら改めて処理したい。

の要件を満たすことはできません。

検証

同時実行数の制限によってLambdaの起動に失敗した場合、トリガーとなったSQSメッセージの受信数がカウントされるのか、検証してみました。

検証環境の構築

SQS

samplesample-deadという2個のキューを用意します。

1. sqs_queue_list.png

またsampleキューはデッドレターキューsample-deadに、最大受信数(デッドレターキューに送信されるまでにメッセージを受信できる最大回数)を1に設定します。

2. sqs_sample_queue_config.png

Lambda

sampleという関数を作成し、sampleキューをイベントソースとして指定します。

3. lambda_with_sqs_as_event_source.png

また関数の同時実行数を0にします。これによりこのLambdaの起動は全て制限されます。

4. lambda_throttling.png

メッセージの送信

sampleキューに対してメッセージを送信します。

5. sqs_send_message.png

送信直後、すぐにメッセージが処理中のメッセージに移動しました。Lambdaのイベントソースとしてメッセージが受信されたことがわかります。しかし、関数の同時実行数は0のため、メッセージがLambdaに渡されることはありません。

6. sqs_message_in_progress.png

しばらくするとメッセージがsample-deadキューに移動しました。同時実行数の制限によってLambdaの起動に失敗した場合でも、トリガーとなったSQSメッセージの受信数はカウントされ、閾値を超えるとデットレターキューに転送されることがわかりました。

7. sqs_message_in_dead_letter_queue.png

結論

同時実行数の制限によってLambdaの起動に失敗した場合でも、トリガーとなったSQSメッセージの受信数はカウントされるがわかりました。よってSQSをイベントソースとするLambdaに同時実行数の制限を設定しただけでは

  • 同時実行数の制限によって処理されなかったSQSメッセージは元のSQSキューに戻し、Lambdaの同時実行数が減ったら改めて処理したい。
  • プログラムのエラーによりLambdaで処理できなかったSQSメッセージはデッドレターキューに転送したい。

の2つの要件を同時に満たせないことがわかりました。

32
17
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
32
17