📝

Lambda の SQS イベントソースマッピングのスケーリング動作について

に公開

SQS イベントソースマッピングのスケーリング動作の設定 - AWS Lambda

メッセージが利用可能な場合、Lambda は、関数を 5 回同時に呼び出すことで、一度に 5 つのバッチの処理を開始します。メッセージがまだ利用可能な場合、Lambda はバッチを読み込むプロセスの数を 1 分あたり最大 300 インスタンスまで増やします。イベントソースマッピングによって同時に処理できるバッチの最大数は 1,000 です。

上記仕様について確認してみました。

スケーリングについて

上記仕様については以下のように認識しました。

  • SQS キューに大量のメッセージを送信しても初めからすべてのメッセージを Lambda で取得できるわけではない
  • メッセージの数に応じて Lambda が自動的にスケーリングする
  • 同時に処理できる最大数は 1,000

検証

  • 以下の設定で Lambda 関数を作成
    • 1 分のスリープ処理
    • タイムアウト: 63 秒
  • 以下の設定で SQS 標準キューを作成
    • 可視性タイムアウト: 378 秒
  • Lambda のイベントソースマッピングに SQS キューを設定
    • バッチサイズ: 1
    • 最大同時実行数: 200
  • SQS キューには以下のスクリプトでメッセージを 500 件送信
for i in {1..50}
do
  aws sqs send-message-batch --queue-url https://sqs.ap-northeast-1.amazonaws.com/012345678901/sample --entries file://send-message-batch.json --no-cli-pager
  echo "Executed $i times"
done

send-message-batch.json には以下の通り 10 件のメッセージを含めています。

send-message-batch.json
[
  {
    "Id": "1",
    "MessageBody": "1"
  },
  {
    "Id": "2",
    "MessageBody": "2"
  },
  {
    "Id": "3",
    "MessageBody": "1"
  },
  {
    "Id": "4",
    "MessageBody": "1"
  },
  {
    "Id": "5",
    "MessageBody": "1"
  },
  {
    "Id": "6",
    "MessageBody": "1"
  },
  {
    "Id": "7",
    "MessageBody": "1"
  },
  {
    "Id": "8",
    "MessageBody": "1"
  },
  {
    "Id": "9",
    "MessageBody": "1"
  },
  {
    "Id": "10",
    "MessageBody": "1"
  }
]

可視性タイムアウトの時間は Lambda 関数のタイムアウトの 6 倍以上が推奨されているため、上記設定にしました。
Configuring an Amazon SQS queue to trigger an AWS Lambda function - Amazon Simple Queue Service

Set the queue's visibility timeout to at least six times the function timeout. This ensures Lambda has enough time to retry if a function is throttled while processing a previous batch.

上記設定でスケーリングを考慮しない前提であれば、メッセージ送信後に Lambda が以下のように呼び出される想定です。

  • 最初の 1 分: 200 回 (最大同時実行数分)
  • 次の 1 分: 200 回 (最大同時実行数分)
  • 次の 1 分: 100 回 (残りのメッセージ分)

検証結果

SQS キューに送信したメッセージ数より、Lambda の Invocations が少ない値で記録されました。

  • SQS キューの NumberOfMessagesSent: 500
  • 1 分ごとの SQS キューの NumberOfMessagesReceived
    • 156
    • 186
    • 142
    • 16
  • 1 分ごとの Lambda の Invocations
    • 156
    • 186
    • 142
    • 16

以上より、SQS キューには 500 個のメッセージが送信されたものの、イベントソースマッピングで設定した最大同時実行数の 200 回分の呼び出しは発生しませんでした。
Lambda 関数がどの程度スケーリングされた状態からスタートなのかや、どの程度の容量がスケーリングしているのかについてはドキュメントに記載がないため非公開であると思われます。

ただし、スケーリングの仕様により最大同時実行数分の Lambda が起動しないケースもあるという点はシステム設計時に考慮する必要がありそうです。

まとめ

今回は Lambda の SQS イベントソースマッピングのスケーリング動作について紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion