Amazon Route 53 で API スロットリングエラーが発生します。
簡単な説明
Route 53 に対して API の一括呼び出しを実行すると、HTTP 400 (不正なリクエスト) のエラーが表示されることがあります。
Code 要素の値が Throttling、Message 要素の値が Rate exceeded であるレスポンスヘッダーは、レートスロットリングを示しています。レートスロットリングは、API リクエストの数が、1 アカウントにつき 1 秒あたり 5 件というハードリミットを超えると発生します。
Route 53 が同じホストゾーンの次のリクエストの前にリクエストを処理できない場合、後続のリクエストは別の HTTP 400 のエラーで拒否されます。レスポンスヘッダーには、次の両方の要素が含まれます。
- 値が PriorRequestNotComplete である Code 要素
- 値が the request was rejected because Route 53 was still processing a prior request. である Message 要素
同じアカウントの AWS Identity and Access Management (IAM) ユーザーからの API 呼び出しは、そのアカウントのグローバルレートスロットリングの対象となります。それらの IAM ユーザーからの API 呼び出しは、AWS マネジメントコンソールから行われる API 呼び出しにも影響します。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) のコマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用しているかどうかを確認してください。
レートスロットリングを回避するには、次のいずれかの方法を使用してください。
リクエストのバッチ処理を行う
API 呼び出しを減らすには、AWS CLI または任意の SDK を使用して、同じタイプの複数のオペレーションを 1 つの変更バッチオペレーションとしてグループ化します。
例えば、1 回のバッチオペレーションで複数のレコードの CREATE、DELETE、または UPSERT (更新と挿入) をリクエストできます。AWS CLI の change-resource-record-sets コマンドを使用して、リソースレコードの一括オペレーションを実行します。
注:
- UPSERT リクエストは 2 回カウントされます。
- change-resource-record-sets API 呼び出しでは、要素と文字にクォータがあります。
エラーの再試行とエクスポネンシャルバックオフを使用する
スロットリングを回避するには、Route 53 API 呼び出しにエラーの再試行とエクスポネンシャルバックオフを追加します。例えば、2^i 秒以内に呼び出しを再試行する単純なエクスポネンシャルバックオフのアルゴリズムを使用します。ここで i は再試行の回数です。
開始時間をランダム化する
Route 53 API を呼び出す開始時間をランダム化します。複数のアプリケーションでロジックを同時に処理していないことを確認してください。リクエストが同時に発生すると、スロットリングが発生する可能性があります。
呼び出しの間に「スリープ時間」を追加する
Route 53 API に対するコード関数の呼び出しが連続している場合は、2 つの呼び出しの間に「スリープ時間」を追加して、スロットリングのリスクを最小限に抑えます。