Amazon SNS の「ThrottlingException」エラーと「レート超過」エラーを解決する方法を教えてください。

所要時間2分
0

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 クォータを増やすことはできません。詳細については、「サービスクォータ」を参照してください。

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません

関連するコンテンツ