Amazon Simple Notification Service (Amazon SNS) の「ThrottlingException」エラーと「レート超過」エラーを解決したいです。
簡単な説明
Amazon SNS API 呼び出しは、各 AWS アカウントおよびリージョンで許可されている API リクエストレートの上限を超えることはできません。API リクエストがこの API スロットリングクォータを超えると、それ以降の API 呼び出しがスロットリングされ、Amazon SNS は ThrottlingException エラーを返します。
Amazon SNS ThrottlingException のエラーメッセージの例:
- 「サブスクライブ操作を呼び出すときにエラーが発生しました (ThrottlingException): レートを超過しました」
- 「ListOriginationNumbers 操作を呼び出すときにエラーが発生しました (ThrottlingException): レートを超過しました」
- 「ListPhoneNumbersOptedOut 操作を呼び出すときに、エラー (ThrottlingException) が発生しました: レートを超過しました」
- 「パブリッシュ操作を呼ぶ出すときにエラーが発生しました (ThrottlingException): レートを超過しました」
- 「GetSMSAttributes 操作を呼び出すときにエラーが発生しました (ThrottlingException): レートを超過しました」
**注:**Amazon SNS API 呼び出しは、サービスのパフォーマンスを向上させるために調整されます。Amazon SNS API スロットリングクォータの詳細については、「Amazon 簡易通知サービスのエンドポイントとクォータ」を参照してください。
解決策
スロットリングされた API を特定する
エラーの原因となっている API アクションを特定する
レート制限が API 呼び出しに割り当てられた制限を超えると、エラーレスポンスが返されます。エラーメッセージまたはエラースタックをチェックして、スロットリングされている API アクションを特定します。
CloudTrail ログを使用して API 呼び出しのイベントを確認します。
Amazon SNS は AWS CloudTrail と統合されています。CloudTrail は Amazon SNS の API 呼び出しをイベントとしてキャプチャします。これらのイベントには、Amazon SNS コンソールからの呼び出しと Amazon SNS API 操作へのコード呼び出しが含まれます。サポートされているイベントは、他の AWS サービスイベントとともに、イベント履歴の一部として CloudTrail イベントに記録されます。CloudTrail イベントの詳細については、「CloudTrail の Amazon SNS 情報」を参照してください。
**注:**Publish API リクエストまたは PublishBatch API リクエストは、CloudTrail のイベントとしてのロギングにはサポートされていません。
リージョナルクォータを調べる
メッセージの送信に Publish API の代わりに PublishBatch API を使用する場合でも、リージョンのクォータによってスロットリングが発生する可能性があります。たとえば、リージョンのクォータが 1 秒あたり 30,000 メッセージである場合でも、以下の方法でレート制限を超える場合があります。
- Publish アクションを 1 秒あたり 30,000 回の API リクエストのレートで使用して、30,000 件のメッセージ (API リクエストごとに 1 メッセージ) を公開しました。
- PublishBatch アクションを 1 秒あたり 3,000 回の API リクエストのレートで使用して、30,000 件のメッセージ (バッチ API リクエストごとに 10 件のメッセージ) を公開しました。
- Publish アクションを 1 秒あたり 10,000 回の API リクエストのレートで使用して、10,000 件のメッセージ(API リクエストごとに 1 メッセージ)を公開しました。また、PublishBatch アクションを 1 秒あたり 2,000 回の API リクエストのレートで使用して、20,000 件のメッセージ (バッチ API リクエストごとに 10 件のメッセージ) を公開しました。その際、1 秒あたり合計 30,000 件のメッセージが公開されました。
1 秒あたりのメッセージ数の割り当ては、Amazon SNS リージョンに公開されるメッセージ数に基づいており、発行と PublishBatch API リクエストを組み合わせたものです。詳細については、「Amazon 簡易通知サービスのエンドポイントとクォータにおける Publish API スロットリングとその他の API スロットリング」を参照してください。
ThrottlingException エラーを防ぐためのベストプラクティス
API 呼び出しの間隔をずらす
AWS API エンドポイントを使用するときは、エクスポネンシャルバックオフとリトライを使用して、行われる API 呼び出しの数を減らします。エクスポネンシャルバックオフとリトライには、以下の大まかな擬似コード例を使用してください。
MakeSDKRequest() {
attempts = 0
loop {
GetSendToken()
response = SNSAPIRequest()
RequestBookkeeping(response)
if not Retryable(response)
return response
attempts += 1
if attempts >= MAX_ATTEMPTS:
return response
if not HasRetryQuota(response)
return response
delay = ExponentialBackoff(attempts)
sleep(delay)
}
}
サービスクォータの引き上げをリクエストする
エクスポネンシャルバックオフとリトライを実装した後も ThrottlingException エラーが引き続き発生する場合は、エラーを引き起こしている API のサービスクォータの引き上げをリクエストしてください。ユースケースの説明には、スロットリングが発生した時間枠と、クォータの引き上げをリクエストする理由を含めてください。
SNS サービスの現在のクォータについては、「サービスクォータダッシュボード」を参照することもできます。
注: 必ず AWS リージョンのサービスクォータの引き上げをリクエストしてください。
**重要:**ソフトリミットの Amazon SNS クォータのみのサービスクォータの引き上げをリクエストできます。ハードリミットの Amazon SNS クォータを増やすことはできません。詳細については、「サービスクォータ」を参照してください。