CloudWatch ログのスロットリングを確認するにはどうすればよいですか?

最終更新日: 2022 年 4 月 6 日

Amazon CloudWatch ログを操作しているときに RequestLimitExceeded エラーまたは ThrottlingException エラーが表示され、API コールがスロットリングされました。CloudWatch ログのスロットリングを防ぐにはどうすればよいですか?

簡単な説明

CloudWatch ログを操作する場合、API のレート制限を超えることがあります。この場合、RequestLimitExceeded エラーまたは ThrottlingException エラーが表示され、API コールがスロットリングされます。これらのエラーを解決し、十分な情報に基づいてレート制限の引き上げリクエストを行うには、どこでいつスロットリングが発生しているのかを特定する必要があります。

解決方法

ログへのアクセス時に CloudWatch ログが断続的にスロットリングされる

FilterLogEvents API コールまたは GetLogEvents API コールを使用して、ログイベントまたはログストリームを一覧表示できます。これらの API コールにはハード制限があり、上限の引き上げはできません。つまり、FilterLogEvents API を使用して指定したロググループからログイベントを検索する場合、デフォルトの quaAPI には、アカウント/リージョンごとに 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 に配信します。詳細については、「Configure Kinesis inputs for the Splunk Add-on for AWS」(AWS 向けの Splunk アドオンの Kinesis 入力を設定する) を参照してください。

PutLogEvents API コールを Lambda 関数と統合するときのスロットリングエラー

PutLogEvents API コールは、1 MB のバッチ単位で指定されるログストリームにログをアップロードするために使用されます。この API には 2 つのレート制限があります。

  • ログストリームごとに 1 秒あたり 5 件のリクエスト。追加のリクエストはスロットリングされます。このクォータは変更できません。
  • 1 個のアカウントおよび 1 つのリージョンごとに、1 秒あたり 800 件のトランザクション。これは、クォータが 1 つのリージョンおよび 1 個のアカウントごとに 1 秒あたり 1,500 件のトランザクションであるリージョン (米国東部 (バージニア北部)、米国西部 (オレゴン)、および欧州 (アイルランド)) を除いて適用されます。クォータの引き上げをリクエストできます。

これに関する詳細と、クォータの引き上げをリクエストする方法については、「CloudWatch Logs クォータ」を参照してください。

指定したログストリームにログを書き込むには、シーケンストークンをリクエストに含める必要があります。これは、前回の呼び出しに対するレスポンスから最後に抽出されたものです。場合によっては、PutLogEvent を呼び出す前に DescribeLogStreams API を使用してログストリーム用に次のシーケンストークンを取得できます。PutLogEvent API には DescribeLogsStream よりもはるかに高い制限があり、これによりスロットリングが発生します。これを軽減するには、DescribeLogStreams の代わりに PutLogEvents API を使用してシーケンスを取得します。シーケンストークンなしで PutLogEvents API を使用すると 400 ステータスコードが表示されますが、このエラーメッセージで次のシーケンストークンが取得されます。このシーケンストークンは PutLogEvents API で再び使用できます。

このユースケースでスロットリングを回避するには、次のヒントを参考にしてください。

  • 同じ API コールで複数のログイベントを組み合わせてみてください。
  • API コールをより多くのログストリームに分散します。
  • エクスポネンシャルバックオフとジッターを含む再試行ロジックを適用します。詳細については、「Managing and monitoring API throttling in your workloads」(ワークロードにおける API スロットリングの管理とモニタリング) を参照してください。
  • 時間の経過に合わせて API コールを均等に分散します。

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] (アラーム名) を入力します。

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?