「Rate exceeded」と 429「TooManyRequestsException」エラーの Lambda 関数のスロットリングをトラブルシューティングする方法を教えてください。

最終更新日: 2020 年 2 月 20 日

AWS Lambda 関数で「Rate exceeded」と 429「TooManyRequestsException」エラーが発生しています。関数がスロットリングされるのはなぜですか?

簡単な説明

スロットリングは、リソースとダウンストリームアプリケーションを保護することを目的としています。Lambda は受信トラフィックに合わせて自動的にスケーリングしますが、さまざまな理由で関数がスロットリングされる可能性があります。次の手順に従って、原因をトラブルシューティングします。

解決方法

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

表示されているスロットリングが Lambda 関数にない可能性があります。関数の呼び出し中に API 呼び出しでスロットリングが発生することもあります。

  1. Amazon CloudWatch Logs にスロットリングメッセージが表示されるが、Lambda Throttles メトリクスには対応するデータポイントがないことを確認します。Lambda Throttles メトリクスがない場合、Lambda 関数コードの API 呼び出しでスロットリングが発生しています。
  2. スロットリングされた API 呼び出しについては、関数コードを確認します。特定の API 呼び出しがスロットリングされている場合は、コードでエクスポネンシャルバックオフを使用して API 呼び出しを再試行してください。
  3. API 呼び出しで 1 秒あたりのトランザクション (TPS) クォータを増やす必要があると判断した場合は、クォータが調整可能であれば、サービスクォータの引き上げをリクエストできます。

同時実行メトリクスを確認する

  1. Amazon CloudWatch の Lambda メトリクスを確認します。スロットリングが発生している AWS リージョンで関数の ConcurrentExecutions メトリクスを確認します。
  2. 同じタイムスタンプの ConcurrentExecutions メトリクスを Throttles メトリクスと比較します。(ConcurrentExecutionsMaximum 統計ThrottlesSum 統計を表示します)。 最大 ConcurrentExecutions が、リージョンの アカウントレベルの同時実行クォータに近いかどうか、および Throttles グラフの対応するデータポイントを確認します。
  3. 特定のリージョンの初期バースト同時実行クォータを超えているかどうかを確認します。CloudWatch コンソールの Lambda のメトリクスページで、グラフの時間範囲を 1 分に減らします。バーストスケーリングによって制限されている場合は、グラフの ConcurrentExecutions の階段パターンに対応する Throttles の急激なスパイクが示されます。バースト同時実行制限を回避するには、プロビジョニングされた同時実行数を設定できます。
  4. 関数の Duration メトリクスのスパイクを確認します。同時実効数は関数の持続時間に依存します。コードの実行に時間がかかりすぎる場合、十分なコンピューティングリソースがない可能性があります。関数のメモリ設定を増やしてみてください。次に、AWS X-Ray および CloudWatch Logs を使用して、継続時間の増加の原因を特定します。関数が Amazon Virtual Private Cloud (Amazon VPC) にある場合、詳細については「VPC の Lambda 関数へのインターネットアクセスを許可する方法を教えてください」を参照してください。
    注: メモリ設定を変更すると、実行時間に対して発生する料金に影響する可能性があります。
  5. 関数の Error メトリクスの増加を確認します。エラーが増えると、再試行が発生し、呼び出しが全体的に増加する可能性があります。(非同期呼び出しの場合、Lambda は失敗した呼び出しをさらに 2 回再試行します)。 呼び出しが増加すると、同時実行数が増加する可能性があります。CloudWatch Logs を使用してエラーを特定および排除し、関数コードで例外を処理します。

予約された同時実行の設定

  1. Lambda 関数で予約された同時実行数を設定したかどうかを確認します。Lambda コンソールを使用するか、GetFunction API を呼び出して設定を確認します。
    注: 予約された同時実行数がゼロになるように関数が設定されている場合、関数はイベントを処理できないため、スロットリングされます。値をゼロよりも大きい値に増やしてください。
  2. 関数の CloudWatchMaximum 統計を確認して、どこかの時点で ConcurrentExecutions メトリクスの最大値に達したかどうかを確認します。
  3. 関数の予約された同時実行数を、スロットリングされないようにする同時実行値まで増やします。Lambda コンソールを使用するか、PutFunctionConcurrency API を呼び出して設定を変更します。

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

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

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

Amazon Simple Storage Service (Amazon S3)Amazon CloudWatch Events などの 非同期イベントソースを使用している場合、デッドレターキュー (DLQ) を使用して関数を設定し、一定のスロットリングルのために破棄されたイベントをキャッチします。これにより、大幅なスロットリングが発生した場合にデータが保護されます。

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

サービスクォータの引き上げをリクエストする

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