Lambda 関数 で「Rate exceeded」および「TooManyRequestsException」というスロットリングエラーが発生する場合のトラブルシューティング方法を教えてください。

所要時間1分
1

AWS Lambda 関数が「Rate exceeded」と「TooManyRequestsException」というスロットリングエラーを返します。

解決策

スロットリングされたリソースを確認する

スロットリングエラーは、Lambda 関数からは発生しなかった可能性があります。スロットリングは、関数の呼び出し全体にわたる API コールで発生する可能性があります。

スロットリングが発生したリソースを識別するには、Amazon CloudWatch Logs およびメトリクスでスロットリングエラーが発生していないか確認します。Lambda の Throttles メトリクスが表示されていない場合は、Lambda 関数コードの API コールでスロットリングが発生しています。

関数ログとコードを参照し、スロットリングされた API コールがないか確認する

API コールが制限されている場合は、コードでエクスポネンシャルバックオフを使用して API コールを再試行します。

注: API コールの 1 秒あたりのトランザクション数 (TPS) クォータを増やす必要がある場合は、サービスクォータの増加をリクエストしてください。クォータには、調整できないものもあります。

関数の同時実行性に関する CloudWatch メトリクスを確認する

スロットリングが発生する AWS リージョン内の関数の ConcurrentExecutions メトリクスを確認します。

ConcurrentExecutionsMaximum 統計情報および ThrottlesSum 統計情報を確認します。ConcurrentExecutions の最大値が、リージョンのアカウントレベルでの同時実行数クォータに近づいていることを確認し、Throttles グラフ内の関連するデータポイントを検証します。

同時実行数クォータを確認する

関数のリージョンにおける、同時実行スケーリングレートを超えていないか確認します。同時実行スケーリングレートは、10 秒ごとに 1,000 個の実行環境インスタンスです。詳細については、「Lambda のスケーリング動作」を参照してください。

CloudWatch コンソールの [Lambda のメトリクス] ページで、グラフの時間範囲を 1 分に減らします。突然の同時実行数制限により制限がかかった場合、Throttles が急増しています。この急増は、グラフ上の ConcurrentExecutions の段階的なパターンに対応しています。

プロビジョニングされた同時実行を設定すると、同時実行数のバーストによる制限を回避できます。Lambda 関数の同時実行制限の増加をリクエストすることもできます。

関数の期間メトリクスで急増が起こっていないか確認する

同時実行は関数の実行時間に左右されます。関数コードの完了に時間がかかりすぎる場合は、十分な計算リソースがない可能性があります。

実行ログの Max Memory Used フィールドを確認し、その値を関数に設定されているメモリ設定と比較します。Max Memory Used が設定されたメモリとほぼ等しい場合、関数は通常、メモリの制約を受けています。詳細については、「Lambda 関数の適切なメモリ設定を判断する」を参照してください。

予約同時実行を設定する

関数に予約同時実行を設定したことを確認します。予約同時実行は、関数の同時実行の境界として機能します。さらに、予約されていない同時実行を消費する可能性のある他の関数から関数を保護します。予約同時実行では関数のスロットリングを軽減できますが、意図せず関数がスロットリングされる原因にもなります。

Lambda コンソールを使用して予約同時実行の設定を確認します。予約同時実行が設定されていない場合、その関数は未予約同時実行を使用します。関数による呼び出しが予約なしの同時実行数を超えると、スロットリングが発生します。

注: 予約同時実行を使用せずに関数を設定した場合、その関数はイベントを処理できないためスロットリングされます。値は必ず 0 より大きい数値に増やしてください。

予約同時実行を設定したり増やしたりする方法については、「関数に予約同時実行を設定する」を参照してください。予約同時実行の問題をトラブルシューティングする方法については、「Lambda での予約同時実行の問題をトラブルシューティングする方法を教えてください」を参照してください。

エクスポネンシャルバックオフを使用する

スロットリングエラーを回避するには、API コールの実行時にエクスポネンシャルバックオフやリトライを使用します。Lambda 関数の API コールを行うアプリケーションでは、エクスポネンシャルバックオフを使用することをおすすめします。

詳細については、「エクスポネンシャルバックオフとジッター」および「リトライ動作」を参照してください。API コールは時間の経過につれ、分散するようにしてください。アクションをランダム化してスケジュールし、時間の経過とともに分散するようにします。

デッドレターキューを使用する

Amazon Simple Storage Service (Amazon S3)Amazon EventBridge スケジューラなどの非同期イベントソースでは、デッドレターキューを使用して関数を設定します。次に、非同期呼び出しのエラー処理に関する設定を確認します。デッドレターキューは、常時スロットリングが発生したことが原因で破棄されたイベントをキャッチし、データを保護します。

注: Amazon Simple Queue Service (Amazon SQS) イベントソースでは、Amazon SQS キューにデッドレターキューを設定する必要があります。

サービスクォータの増加をリクエストする

ワークロードにおいて、同時実行に追加のサービスクォータが必要な場合は、サービスクォータの増加をリクエストしてください。

関連情報

Lambda 関数を使用する際のベストプラクティス

Lambda での呼び出しに関する問題のトラブルシューティング

Lambda での再試行動作について

コメントはありません

関連するコンテンツ