LoginSignup
40
36

More than 1 year has passed since last update.

SQS + Lambdaをやってみた

Last updated at Posted at 2019-02-17

[2021-07-10追記]
本記事はSQS標準キューについての記述である。
SQS FIFOキューの場合は、Lambdaの最大並列実行数はMessage Groupの数となる。

Total concurrency is equal to or less than the number of unique MessageGroupIds in the SQS FIFO queue.
https://aws.amazon.com/jp/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/

[2021-07-22追記]
SQS FIFOキューはexactly onceの配信を保証しているが、SQS FIFOキューをLambdaトリガーとした場合はやはりLambda関数に冪等性が求められる。

However, it does not guarantee only once delivery when used as a Lambda trigger. If only once delivery is important in your serverless application, it’s recommended to make your function idempotent.
https://aws.amazon.com/jp/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/


LambdaのトリガーとしてSQSを指定できるのでやってみた。

実験してみた結果

  • キューにメッセージが入るとほぼ瞬時にLambdaが実行される
  • Lambda 関数を同期的に呼び出します
  • Lambdaが実行されると、メッセージは自動的にキューから削除される。自分で削除する必要はない。
  • メッセージのbodyはLambdaのeventに入ってくるので、自分でReceiveMessageする必要がない。
  • エラーが起きた場合
    • デッドレターキューが無い場合は、メッセージの保持期限が切れるまでリトライされる
    • デッドレターキューがある場合は、自分で決めた最大受信回数だけリトライされ、その後デッドレターキューに入る
    • 可視性タイムアウトを5分、最大受信回数を1回にした場合、Lambdaが1回呼び出された後5分経過してからデッドレターキューに入った
  • Lambda関数に同時実行数が設定してある場合は、ちゃんとその数を保ったまま、すべてのメッセージが順次処理される
  • 同時実行数を制限しつつ、適度なリトライ回数を設定するのが難しい
    • 同時実行数はちゃんと設定できるのだが、それにひっかかった場合すぐにリトライが行われ、キューの「最大受信数」(1つのメッセージを何回リトライ受信することを許すか)にひっかかってすぐにデッドレターキューに入ってしまうらしい
    • 可視性タイムアウトは30秒にしていたが、30秒も待たずにすぐリトライが行われていた
  • 結論として、LambdaのトリガーとしてSQSを指定するのは、Lambdaの同時実行数を気にする場合は使いづらいと思った
  • 基本的にSQSの標準キューは順番も保証せず、1つのメッセージが2回以上配信されることもあるのでLambda関数には冪等性が必要になる

参考

キューから読み取るイベントソースマッピングについては、ソースキューの再試行ポリシーおよび可視性タイムアウトを設定することで、失敗したイベントの送信先と再試行の間の時間の長さを決定します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/retries-on-errors.html

LambdaのリトライをAWS SQSを使ってやってみる | DevelopersIO

40
36
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
40
36