🎉
SQS と Lambda のややこしい設定の整理
まとめ
- Lambda 単体で同時実行数を制御したい
AWS::Serverless::Function Properties.ReservedConcurrentExecutions
- SQS -> Lambda における Lambda の起動条件を制御したい
- Lambda の同時実行数
AWS::Serverless::Function Events.[SQS].Properties.ScalingConfig.MaximumConcurrency
-
AWS::Serverless::Function Properties.ReservedConcurrentExecutions
で制御しようとすると、キューから溢れたメッセージについてリトライがかかり、スロットリングの恐れがある
- Lambda が一度に受け取る SQS のメッセージ数の上限
-
AWS::Serverless::Function Events.[SQS].Properties.BatchSize
(デフォルトは 10)
-
- Lambda がメッセージをポーリングする待機時間の上限
-
AWS::Serverless::Function Events.[SQS].Properties.MaximumBatchingWindowInSeconds
(デフォルトは 0) -
AWS::SQS::Queue Properties.ReceiveMessageWaitTimeSeconds
という SQS 側でショート/ロングポーリングを制御する設定もある-
ReceiveMessageWaitTimeSeconds
に設定されている値より、MatximumBatchingWindowInSecounds
の値が小さい場合、
ReceiveMessageWaitTimeSeconds
が優先される模様[1]
-
-
- Lambda の同時実行数
- SQS -> Lambda を完全に直列で起動したい
- 最新の設定
-
AWS::SQS::Queue Properties.FifoQueue
を true に設定 -
AWS::Serverless::Function Events.[SQS].Properties.ScalingConfig.MaximumConcurrency
を 1 に設定 -
AWS::Serverless::Function Events.[SQS].Properties.BatchSize
を 1 に設定
-
- 以前までの設定
-
AWS::SQS::Queue Properties.FifoQueue
を true に設定 -
AWS::Serverless::Function Properties.ReservedConcurrentExecutions
を 1 に設定 -
AWS::Serverless::Function Events.[SQS].Properties.BatchSize
を 1 に設定 - SQS が FIFO の場合、なぜかキューから溢れたメッセージについてスロットリングが起きない
- しかし、
MaximumConcurrency
が導入された現在では最新の設定のほうがよいと思われる
- しかし、
-
- 最新の設定
Discussion