Amazon CloudWatch ログを操作しているときに「RequestLimitExceeded」または「ThrottlingException」エラーが表示され、API コールがスロットリングされます。
簡単な説明
CloudWatch ログを操作する場合、API のレート制限を超えることがあります。この場合、「RequestLimitExceeded」または「ThrottlingException」エラーが表示され、API コールがスロットリングされます。これらのエラーを解決し、十分な情報に基づいてレート制限の引き上げリクエストを行うには、どこでいつスロットリングが発生しているのかを特定する必要があります。
解決方法
ログへのアクセス時に CloudWatch ログが断続的にスロットリングされる
FilterLogEvents または GetLogEvents API コールを使用して、ログイベントまたはログストリームを一覧表示できます。これらの API コールにはハード制限があり、上限の引き上げはできません。つまり、FilterLogEvents API を使用して指定したロググループからログイベントを検索する場合、デフォルトの quaAPI には、デフォルトのクォータが設定されています。この見積もりは、アカウントまたは AWS リージョンあたり 5 トランザクション/秒 (TPS) です。この上限に達すると、「RateExceeded」エラーが表示されます。
このユースケースでスロットリングエラーを回避するために、次のベストプラクティスを使用します。
アプリケーション/スクリプトを使用して CloudWatch ログデータを取得する場合に ThrottlingException エラーが発生する
CloudWatch ログを収集するために、コレクタースクリプトを開発できます。このスクリプトは DescribeLogStream または GetLogEvents API コールを実行して、同じロググループ内の異なるログストリームまたは異なるタイムフレームからデータをプルしようとします。FilterLogEvents、GetLogEvents、DescribeLogStreams などの API コールは、オートメーションではなく、人間とのやり取りのために設計されています。このことは、エラーが発生し、API コールがスロットリングされることを意味します。
このユースケースでスロットリングを回避するには、次のベストプラクティスを使用します。
- API コールを実行する場合は、エクスポネンシャルバックオフと再試行を使用します。詳細については、「Exponential backoff and jitter」(エクスポネンシャルバックオフとジッター) および「AWS でのエラー再試行とエクスポネンシャルバックオフ」を参照してください。
- 時間の経過に合わせて API コールを分散します。一定の期間にわたってアクションが分散されるように、ランダム化を実行してアクションをスケジュールします。
- 連続する API コールの間にスリープ間隔を追加します。同じスクリプトまたはアプリケーションから送信される API コールの間に、多少の遅延を追加します。API コールが急速に連続して送信されると、レートエラーが発生する可能性が高くなります。
- 場合によっては、CloudWatch からログを取得するために、Splunk などの SIEM ソリューションを使用することがあります。SIEM ソリューションは、複数のシステムからデータを収集し、このデータを分析して異常な動作を検出するために使用されます。Splunk プラグインを使用すると、API スロットリングが発生する場合があります。この問題を回避するには、Amazon Kinesis Data Firehose で CloudWatch ログサブスクリプションフィルターを作成し、ログデータを Splunk に配信します。詳細については、Splunk のドキュメントで「Configure Kinesis inputs for the Splunk Add-on for AWS」(AWS 向けの Splunk アドオンの Kinesis 入力を設定する) を参照してください。
PutLogEvents API コールを Lambda 関数と統合するときのスロットリングエラー
PutLogEvents API コールは、1 MB のバッチ単位で指定されるログストリームにログをアップロードするために使用されます。この API には、1 つのリージョンにつき、1 個のアカウントあたり 800 TPS のレート制限があります。これは、クォータが 1 つのリージョンごとに 1 個のアカウントにつき 1,500 TPS であるリージョン (米国東部 (バージニア北部)、米国西部 (オレゴン)、および欧州 (アイルランド)) を除いて適用されます。クォータの引き上げをリクエストできます。
これに関する詳細と、クォータの引き上げをリクエストする方法については、「CloudWatch Logs クォータ」を参照してください。
CloudWatch Logs のサービスクォータを管理する
AWS では、パフォーマンスを保護し、可用性を確保するために、サービスのクォータを定義しています。CloudWatch には、メトリクス、アラーム、API リクエスト、アラーム E メール通知のクォータがあります。サービスクォータを可視化し、しきい値に達した場合にアラームを送信するように設定するには、次の手順を実行します。
1. Service Quotas コンソールを開きます。
2. ナビゲーションペインで [AWS services] (AWS のサービス) を選択します。
3. [AWS services] (AWS のサービス) のリストから [Amazon CloudWatch logs] (Amazon CloudWatch ログ) を検索します。
4. [Service quotas] (サービスクォータ) リストには、サービスクォータ名、適用される値 (使用可能な場合)、AWS デフォルトクォータ、クォータの値が調整可能かどうかなど、いくつかの属性またはオプションが表示されます。
5. 説明など、サービスクォータに関する詳細情報を表示するには、クォータ名を選択します。
6. クォータ名を選択すると、このクォータに関する詳細情報が表示されます。例えば、[GetLogEvents throttle limit in transactions per second] (GetLogEvents スロットリング制限 (1 秒あたりのトランザクション数)) を選択すると、次の項目が表示されます。
説明
クォータコード
クォータ ARN
使用状況: %
適用されたクォータ値
AWS のデフォルトクォータ値
調整可能性: Y/N
7. [Amazon CloudWatch alarms] (Amazon CloudWatch アラーム) セクションで、[Create alarm] (アラームを作成) を選択し、[Alarm threshold] (アラームのしきい値) と [Alarm name] (アラーム名) を入力します。
関連情報
CloudWatch API で PutMetricData を呼び出すときに、スロットリングを回避する方法を教えてください