「レートを超過しました」というエラーと 429「TooManyRequestsException」というエラーの Lambda 関数のスロットリングをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 4 月 14 日

AWS Lambda 関数が「レートを超過しました」というエラーと 429「TooManyRequestsException」というエラーを生成しています。関数がスロットリングされているのはなぜですか? また、エラーを解決するにはどうすればよいですか?

解決方法

Lambda 関数は、リソースとダウンストリームアプリケーションを保護するためにスロットリングされることがあります。Lambda は受信トラフィックに合わせて自動的にスケーリングしますが、さまざまな理由で関数がスロットリングされる可能性があります。

レートが超過しました」というエラーや「TooManyRequestsException」というエラーを含む Lambda のスロットリングの問題のトラブルシューティングを行うには、次の手順を実行します。

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

スロットリングエラーは、Lambda 関数から発生していない可能性があります。関数の呼び出し中に API 呼び出しでスロットリングが発生することもあります。

スロットリングされているリソースを確認するには、次の手順を実行します。

Amazon CloudWatch Logs をチェックして、スロットリングエラーがあるが、Lambda Throttles メトリクスに対応するデータポイントがないかどうかを確認する

Lambda Throttles メトリクスがない場合、Lambda 関数コードの API 呼び出しでスロットリングが発生しています。

スロットリングされた API 呼び出しについて関数コードを確認する

特定の API 呼び出しがスロットリングされている場合は、コードでエクスポネンシャルバックオフを使用して API 呼び出しを再試行してください。

注: API 呼び出しで 1 秒あたりのトランザクション (TPS) クォータを増やす必要があると判断した場合は、サービスクォータの引き上げをリクエストできます。すべてのクォータが調整可能なわけではありません。

関数の同時実行メトリクスをチェックする

Amazon CloudWatch の Lambda メトリクスを確認する

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

同じタイムスタンプの ConcurrentExecutions メトリクスを Throttles メトリクスと比較する

ConcurrentExecutionsMaximum 統計ThrottlesSum 統計を表示します。最大 ConcurrentExecutions が、リージョンの アカウントレベルの同時実行クォータに近いかどうか、および Throttles グラフの対応するデータポイントを確認します。

特定の AWS リージョンの初期バースト同時実行クォータを超えているかどうかを確認する

CloudWatch コンソールの Lambda のメトリクスページで、グラフの時間範囲を 1 分に減らします。バーストスケーリングによって制限されている場合は、グラフの ConcurrentExecutions の階段パターンに対応する Throttles のスパイクが示されます。

注: バースト同時実行制限を回避するには、プロビジョニングされた同時実行を設定できます。

関数の Duration メトリクスのスパイクを確認する

同時実行は関数の持続時間に依存します。関数コードの実行に時間がかかりすぎる場合、十分なコンピューティングリソースがない可能性があります。

関数のメモリ設定を増やしてみてください。その後、AWS X-Ray および CloudWatch Logs を使用して、継続時間の増加の原因を特定します。

注: メモリ設定を変更すると、実行時間に対して発生する料金に影響する可能性があります。

関数が Amazon Virtual Private Cloud (Amazon VPC) にある場合は、VPC の Lambda 関数へのインターネットアクセスを許可する方法を教えてくださいを参照してください。

関数の Error メトリクスの増加を確認する

エラーが増えると、再試行が発生し、呼び出しが全体的に増加する可能性があります。呼び出しが増加すると、同時実行が増加する可能性があります。CloudWatch Logs を使用してエラーを特定および排除し、関数コードで例外を処理します。

注: 関数は、リージョンごとの呼び出しリクエスト (1 秒あたりのリクエスト数) に基づいてスロットリングすることもできます。これは、同時実行クォータの 10 倍です。

予約された同時実行を設定する

関数で予約された同時実行が設定されていることを確認する

Lambda コンソールを使用するか、GetFunction API を呼び出して設定を確認します。

注: 予約された同時実行がゼロになるように関数が設定されている場合、関数はイベントを処理できないため、スロットリングされます。値をゼロよりも大きい値に増やしてください。

関数の Maximum 統計を CloudWatch で確認する

関数メトリクスがいずれかの時点で ConcurrentExecutions メトリクスの最大値に達しているかどうかを確認します。

関数の予約された同時実行を、関数がスロットリングされないようにする同時実行値まで増やす

Lambda コンソールを使用するか、PutFunctionConcurrency API を呼び出して設定を変更します。

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

ベストプラクティスとして、Lambda 関数を呼び出すアプリケーションでエクスポネンシャルバックオフを使用して、スロットリングされたリクエストを再試行します。

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

Amazon Simple Storage Service (Amazon S3)Amazon CloudWatch Events などの非同期イベントソースの場合は、デッドレターキュー (DLQ) を使用して関数を設定します。DLQ は、一定のスロットリングによって破棄されたイベントを捕捉し、大幅なスロットリングが見られる場合はデータを保護できます。

注: Amazon Simple Queue Service (Amazon SQS) イベントソースの場合、Amazon SQS キューで DLQ を設定する必要があります。

サービスクォータの緩和をリクエストする

同時実行のためにワークロードにより多くのサービスクォータが必要であると判断した場合は、Service クォータコンソールサービスクォータの引き上げをリクエストします。