Amazon Simple Notification Service (Amazon SNS) の "ThrottlingException Rate exceeded" エラーを解決したいです。
簡単な説明
Amazon SNS API リクエストが API スロットリングクォータを超えると、Amazon SNS は次のような "ThrottlingException Rate exceeded" エラーを返します。
"An error occurred (ThrottlingException) when calling the API operation: Rate exceeded"
注: Amazon SNS は API コールをスロットリングしてサービスのパフォーマンスを向上させます。Amazon SNS API スロットリングクォータの詳細については、「Amazon Simple Notification Service endpoints and quotas」(Amazon Simple Notification Service のエンドポイントとクォータ) を参照してください。
解決策
スロットリングされた API を特定する
レート制限が API コールに割り当てられた制限を超えると、エラーレスポンスが返されます。エラーメッセージまたはエラースタックをチェックして、スロットリングされている API アクションを特定します。
AWS CloudTrail ログを使用して API コールのイベントを確認します。サポートされているイベントは、他の AWS サービスイベントとともに、イベント履歴の一部として CloudTrail イベントに記録されます。詳細については、「Logging AWS SNS API calls using AWS CloudTrail」(AWS CloudTrail を使用して AWS SNS API コールをログに記録する) を参照してください。
Amazon SNS の Amazon CloudWatch メトリクスを表示することもできます。Amazon SNS 使用メトリクスを使用して、レート制限に達した SNS API コールを特定します。
Amazon SNS API スロットリングクォータを確認する
Amazon SNS API スロットリングクォータは AWS リージョンによって異なります。1 秒あたりのメッセージ数のクォータは、SNS リージョンに公開されたメッセージの数と、Publish および PublishBatch API リクエストを組み合わせたものです。リージョンの 1 秒あたりのメッセージ数のクォータを超えると、スロットリングエラーが発生する可能性があります。詳細については、「Amazon SNS API throttling」(Amazon SNS API スロットリング) を参照してください。
注: CloudTrail ログが有効化されると、SNS の Publish および PublishBatch API リクエストが CloudTrail に記録されます。ただし、SNS リソースタイプ AWS::SNS::PhoneNumber は CloudTrail によってログに記録されません。
エクスポネンシャルバックオフとリトライを使用する
スロットリングエラーを回避するには、API コールを行うときにエクスポネンシャルバックオフとリトライを使用して間隔をずらすのがベストプラクティスです。API コールは時間の経過につれ、分散するようにしてください。アクションをランダム化してスケジュールし、時間の経過とともに分散するようにします。詳細については、「Exponential backoff and jitter」(エクスポネンシャルバックオフとジッター) および「Retry behavior」(リトライ動作) を参照してください。
エクスポネンシャルバックオフとリトライには、以下の大まかな擬似コード例を使用してください。
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 Rate exceeded" エラーが表示される場合は、SNS クォータの引き上げリクエストを送信してください。
注: ソフト制限の引き上げをリクエストすることはできますが、ハードクォータの制限を増やすことはできません。詳細については、「Service Quotas」を参照してください。