Amazon Simple Queue Service (Amazon SQS) キューのイベントソースで、AWS Lambda 関数が期待どおりにスケーリングされません。最適な同時実行数を設定したいです。
解決策
注: Amazon SQS キューをイベントソースとして設定すると、Lambda 関数は 1 分あたりさらに 300 インスタンスまで最適にスケールアップできます。標準キューの最大同時実行数は 1,250 です。先入先出 (FIFO) イベントソースマッピングを使用する場合、関数はアクティブなメッセージグループの数まで同時にスケールインできます。
Lambda 関数呼び出しの問題を特定して解決する
スケーリング時のエラーを防ぐため、Lambda は呼び出しで問題が発生したときに関数のスケーリングを制限します。問題を解決した後も、Lambda は引き続き関数をスケーリングします。詳細については、「]( 関数呼び出しエラーを解決するには、「Lambda での SQS イベントソースのエラー処理」と「Lambda 関数での障害のトラブルシューティング方法を教えてください」を参照してください。
最適な同時実効数で Lambda 関数を設定する
予約された同時実行数
関数に予約された同時実行数を設定した場合、予約された値に達すると、Lambda が関数をスロットリングします。イベントソースマッピングには予約された同時実行数が含まれていないため、関数に送信するメッセージよりも多いメッセージをキューから処理できます。
関数に予約されている同時実行数の最小数は、標準 SQS キューでは 1,250 であり、FIFO キューのアクティブなメッセージグループの合計数と同じである必要があります。予約した同時実行数を FIFO キュー内のメッセージグループの数より多くするのがベストプラクティスです。予約された同時実行数が少ないと、FIFO キューからの処理が遅れ、関数がスロットリングされる可能性があります。
重要: 同時呼び出しの数を制限するには、予約された同時実行ではなく、Amazon SQS イベントソースの最大同時実行設定を使用します。
デフォルトの同時実行数
AWS アカウントでは、同じアカウントと AWS リージョンのすべての関数について、デフォルトの同時実行クォータが 1,000 に設定されています。関数は、利用可能な最大同時実行数に達するまでスケーリングされます。すべての関数が同時実行数 1,000 件のプールを使用するようになると、Lambda は呼び出しをスロットリングします。
Lambda では、トラフィックが突然急増しても関数が過度にスケーリングされないように、関数のスケーリング速度を制限しています。Lambda 関数は、最初は同時実行スケーリングレートに基づいてスケーリングされます。同時実行スケーリングレートは関数レベルであるため、アカウント内の各関数は他の関数に依存せずにスケーリングできます。同時実行スケーリングレートは、関数で使用できる同時実行の合計量を指定するアカウントレベルの同時実行クォータとも異なります。
注: デフォルトの同時実行数は、プロビジョニングされた同時実行数とは異なります。詳細については、「予約された同時実行数とプロビジョニングされた同時実行数について」を参照してください。
最大同時実行数の設定
1 つのイベントソースに最大同時実行数を設定すると、その値は、かかる特定のイベントソースにのみ適用されます。同時実行数が上限に達していない追加のイベントソースは、残りのアカウントの同時実行クォータまたは予約済み同時実行数を使用します。
最大同時実行数の設定と予約済み同時実行数は、併用できます。関数のスロットリングを防ぐために、最大同時実行数を関数の予約された同時実行数よりも少なく設定するのがベストプラクティスです。
Amazon SQS キューに Lambda 関数をスケーリングするのに十分な数のメッセージがあることを確認する
Amazon SQS キューが Lambda 関数を呼び出すように設定されている場合、Lambda はキューにメッセージがある場合にのみ呼び出しをスケーリングします。
Amazon CloudWatch を使用してキュー内の処理する必要があるメッセージの数を確認するには、キューの ApproximateNumberOfMessagesVisible メトリクスを確認します。
メトリクスが低いか 0 の場合、関数はスケーリングできません。
メトリクスが高く、呼び出しに問題がない場合は、Duration メトリクスが急増しなくなるまでイベント通知のバッチサイズを増やします。Lambda のメトリクスの詳細については、「メトリクスのタイプ」を参照してください。
注: 標準 Amazon SQS キューの最大バッチサイズは 10,000 レコードです。FIFO キューの場合、最大バッチサイズは 10 レコードです。
Amazon SQS がメッセージをキューに追加していることを確認する
Amazon SQS が新しいメッセージをキューに追加していることを確認するには、キューの NumberOfMessagesSent メトリクスを確認します。
コンシューマーが ReceiveMessage API コールを行っていることを確認する
コンシューマーが ReceiveMessage API コールを行っていることを確認するには、キューの NumberOfMessagesReceived メトリクスを確認します。
注: NumberOfEmptyReceives メトリクスの急増は、コンシューマーが ReceiveMessage API コールを行っているが、その呼び出しによってキューからメッセージが返されていないことを示しています。この問題は、キューにメッセージがない場合に発生します。
関連情報
Amazon SQS で Lambda を使用する
AWS Lambda 関数の同時実行数を管理する