🎉

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]
  • 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 が導入された現在では最新の設定のほうがよいと思われる
脚注
  1. batch window lower than 20s but lambda function is called in 20s interval (AWS re:Post) ↩︎

GitHubで編集を提案

Discussion