同時実行数が、Amazon Simple Queue Service (Amazon SQS) の FIFO (ファーストイン、ファーストアウト) イベントソースのメッセージグループ ID または Maximum Concurrency 値よりも多い状態をトラブルシューティングしたいです。
簡単な説明
Amazon SQS FIFO イベントソースで Lambda を使用する場合、同時実行数はキュー内の MessageGroupIds の数と同じかそれ未満になります。
次の理由により、関数の同時実行数がキュー内のユニークでアクティブな MessageGroupIds の数よりも多くなる可能性があります。
- 複数のイベントソースが同じ機能を使用している。
- 保持期間が関数の実行時間よりも短い。
- Lambda の同時実行メトリックスが、MessageGroupIds で指定した数よりも多い。
- Lambda 拡張機能を使用している。
解決策
複数のイベントソースが同じ機能を使用している
関数のイベントソースが 1 つだけであることを確認してください。関数に複数のイベントソースがある場合、別のイベントソースがその関数を使用することで、同時実行数が増える場合があります。
保持期間が関数の実行時間より短い
キューに設定されている保持期間が関数の実行時間よりも短い場合は、キューの保持期間を増やします。
また、Lambda は同じ MessageGroupId からのメッセージを追跡せず、使用可能になるとすぐにメッセージをポーリングするため、同時実行数が増える要因となります。Lambda 関数の操作が行われているときにメッセージが期限切れにならないようにするには、SQS FIFO キューの保持期間を増やします。メッセージは、MessageGroupId の FIFO 順に処理されます。
Lambda の同時実行メトリックスが、MessageGroupIds で指定した数よりも多い
メトリクスの生成方法が理由で、Lambda の同時実行メトリクスが MessageGroupIds で指定した数よりも多くなる場合があります。これ以上のメッセージは同時に呼び出されません。代わりに、Lambda は呼び出されたメッセージごとに同時実行カウンターを 1 ずつ増やし、呼び出しが完了して応答が返されるとカウンターを減らします。
イベントソースマッピングでは、同時実行数は並行して実行される Lambda ハンドラー操作の数です。Lambda バックエンドでは、ハンドラーコード操作を完了し、現在後処理段階にある関数が同時実行数の合計にカウントされます。
また、Lambda は予約済みの同時実行をイベントソースマッピングと同様に扱います。予約済みの同時実行は設定しないのがベストプラクティスです。予約済みの同時実行を設定する必要がある場合は、MessageGroupIds の数よりも少し大きい数に設定します。
注: 新しいメッセージは、前のメッセージが完了した後にのみ呼び出されます。メッセージは常に順番に処理されます。
Lambda 拡張機能による同時実行数の増加
Lambda 拡張機能を使用すると、Lambda オペレーションが完了した後も拡張機能が実行されるため、同時実行数が増える場合があります。たとえば、拡張機能がアタッチされていて、/next を呼び出さなかった場合も、ランタイムに /next を呼び出すことがあります。
Lambda 拡張機能により同時実行数が増えているかどうかを確認するには、以下の操作を行います。
- パフォーマンスメトリック PostRuntimeExtensionsDuration を監視し、ランタイムの Next API と、最後の拡張機能の Next API との間の累積時間を判定します。
- Lambda 関数が完了した後も、Lambda 拡張機能が引き続き実行され、環境を維持しているかどうかを確認します。
- Lambda インスタンスが関数の同時実行数を超えているかどうかを確認します。2 つのインスタンスが同じ環境に同時にある場合、スロットリングが発生します。詳細については、「Lambda 拡張機能 API を使用して拡張機能を作成する」を参照してください。
- ConcurrentExecutions メトリクスと PostRuntimeExtensionsDuration メトリクスを比較します。ConcurrentExecutions の最大値が Amazon SQS イベントソースのクォータを超えているかどうかを確認します。詳細については、「同時実行を監視する」を参照してください。
関連情報
Amazon SQS での Lambda の使用