AWS Lambda 関数が「Rate exceeded」(レートを超過しました) というエラーと 429「TooManyRequestsException」というエラーを生成しています。
Lambda 関数は、リソースとダウンストリームアプリケーションを保護するためにスロットリングされることがあります。Lambda は着信トラフィックに合わせて自動的にスケーリングしますが、さまざまな理由で関数がスロットリングされる可能性があります。
「Rate exceeded」(レートが超過しました) というエラーや「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 メトリクスと比較する
ConcurrentExecutions の Maximum 統計と Throttles の Sum 統計を表示します。最大 ConcurrentExecutions が、リージョンの アカウントレベルの同時実行クォータに近いかどうか、および Throttles グラフの対応するデータポイントを確認します。
特定の AWS リージョンの初期バースト同時実行クォータを超えているかどうかを確認する
CloudWatch コンソールの Lambda の [Metrics] (メトリクス) ページで、グラフの時間範囲を 1 分に狭めます。バーストスケーリングによって制限されている場合は、グラフの ConcurrentExecutions の階段パターンに対応する Throttles のスパイクが示されます。
注: バースト同時実行制限を回避するには、プロビジョニングされた同時実行を設定できます。
関数の Duration メトリクスのスパイクを確認する
同時実行は関数の持続時間に依存します。関数コードの実行に時間がかかりすぎる場合、十分なコンピューティングリソースがない可能性があります。
関数のメモリ設定を増やしてみてください。その後、AWS X-Ray および CloudWatch Logs を使用して、継続時間の増加の原因を特定します。
注: メモリ設定を変更すると、実行時間に対して発生する料金に影響する可能性があります。
この関数は Amazon Virtual Private Cloud (Amazon VPC) に追加できます。関数が Amazon VPC にある場合は、「Amazon VPC に接続されている Lambda 関数にインターネットアクセスを許可するにはどうすればよいですか?」を参照してください。
関数の Errors メトリクスの増加を確認する
エラーが増えると、再試行が発生し、呼び出しが全体的に増加する可能性があります。呼び出しが増加すると、同時実行が増加する可能性があります。CloudWatch Logs を使用してエラーを特定および排除し、関数コードで例外を処理します。
注: 関数は、リージョンごとの呼び出しリクエスト (1 秒あたりのリクエスト数) によってもスロットリングされます。これは、同時実行クォータの 10 倍です。
関数で予約された同時実行が設定されていることを確認する
Lambda コンソールを使用して設定を確認するか、GetFunction API を呼び出します。
注: 予約された同時実行がゼロになるように関数を設定した場合、関数はイベントを処理できないため、スロットリングされます。値をゼロよりも大きい値に増やしてください。
関数の Maximum 統計を CloudWatch で確認する
関数メトリクスがいずれかの時点で ConcurrentExecutions メトリクスの最大値に達しているかどうかを確認します。
関数の予約された同時実行を、関数がスロットリングされないようにする同時実行値まで増やす
Lambda コンソールを使用して設定を変更するか、PutFunctionConcurrency API を呼び出します。
スロットリングされたリクエストを再試行するには、Lambda 関数を呼び出すアプリケーションでエクスポネンシャルバックオフを使用するのがベストプラクティスです。
Amazon Simple Storage Service (Amazon S3) や Amazon EventBridge などの非同期イベントソースの場合は、デッドレターキュー (DLQ) を使用して関数を設定します。DLQ は、一定のスロットリングによって破棄されたイベントを捕捉し、大幅なスロットリングが見られる場合はデータを保護できます。
注: Amazon Simple Queue Service (Amazon SQS) イベントソースの場合、Amazon SQS キューで DLQ を設定する必要があります。
同時実行のために、ワークロードでより高いサービスクォータが必要な場合は、サービスクォータコンソールを使用してサービスクォータの引き上げをリクエストしてください。
AWS Lambda 関数を使用するためのベストプラクティス
AWS Lambda で呼び出す際の問題をトラブルシューティングする
エラー処理と AWS Lambda での自動再試行