Amazon CloudWatch ログを操作しているときに "RequestLimitExceeded" または "ThrottlingException" エラーが発生し、API コールがスロットリングされます。
簡単な説明
CloudWatch ログを操作すると、API レートクォータを超える可能性があります。この場合、API コールがスロットリングされ、RequestLimitExceeded または ThrottlingException エラーが発生します。これらのエラーを解決するために、スロットリングエラーが発生する場所とタイミングを特定します。次に、情報に基づいてレートクォータの増加を申請します。
解決策
ログにアクセスすると CloudWatch Logs で断続的にスロットリングエラーが発生する
ログイベントまたはログストリームを一覧表示するには、FilterLogEvents または GetLogEvents API コールを使用します。これらの API コールはクォータ増加の対象にはなりません。ただし、FilterLogEvents API を使用して指定したロググループのログイベントを検索するときには、クォータが適用されます。クォータは、AWS アカウントまたは AWS リージョンごとに 1 秒あたり 5 トランザクション (TPS) です。このクォータに達すると、RateExceeded エラーが発生します。
これらのスロットリングエラーを回避するには、サブスクリプションフィルターを使用して CloudWatch ログからのログデータをリアルタイムで即時取得します。詳細については、「ロググループレベルのサブスクリプションフィルター」および「サブスクリプションによるログデータのリアルタイム処理」を参照してください。
また、CloudWatch Logs Insights を使用して CloudWatch ログからログデータをすばやく取得することもベストプラクティスです。特定のロググループを確認するには、クエリを使用してログをフィルター処理します。バッチユースケース用には、Amazon Simple Storage Service (Amazon S3) にログデータをエクスポートする必要があります。
注: ログデータが処理され、CloudWatch Logs からデータをエクスポートできるようになるまで、最大 12 時間かかることがあります。この方法をリアルタイムの分析と処理に使用することはベストプラクティスではありません。
スクリプトを使用して CloudWatch ログデータを取得するときの ThrottlingException エラー
コレクタースクリプトを作成し、CloudWatch ログを収集することができます。同じロググループ内の別々のログストリームや時間範囲からデータを取得するには、DescribeLogStreams または GetLogEvents API コールを行うスクリプトを作成します。ただし、FilterLogEvents、GetLogEvents、DescribeLogStreams などの API コールは、自動化を目的としたものではなく、人間の操作を目的として設計されています。これらの API をスクリプトで使用すると、API コールが制限され、エラーが発生します。
このユースケースでのスロットリングエラーを回避するには、API コールを行うときにエクスポネンシャルバックオフやリトライを使用します。詳しくは、「エクスポネンシャルバックオフとジッター」および「リトライ動作」を参照してください。API コールは時間の経過につれ、分散するようにしてください。アクションを一定期間に分散するようにランダム化してスケジュールします。
API コールを連続して送信すると、レートエラーが発生する可能性があります。この問題を回避するには、連続する API コールの間にスリープ間隔を追加します。さらに、同じスクリプトまたはアプリケーションが送信する API コールの間に遅延を追加します。
Splunk などのセキュリティ情報およびイベント管理 (SIEM) ソリューションを使用して CloudWatch からログを取得すると、Splunk プラグインにより API スロットリングエラーが発生する可能性があります。この問題を回避するには、Amazon Data Firehose を使用して CloudWatch ログサブスクリプションフィルターを作成します。次に、ログデータを Splunk に配信します。詳細については、Splunk のウェブサイトで「Amazon Web Services 用 Splunk アドオンの概要」を参照してください。
PutLogEvents API コールを Lambda 関数と統合する際のスロットリングエラー
PutLogEvents API コールを AWS Lambda 関数と統合すると、PutLogEvents は指定されたログストリームに 1 MB のバッチ単位でログをアップロードします。この API のレートクォータは、アカウント、リージョンにつき、1 秒あたり 5,000 トランザクションです。
詳細およびクォータの増加を申請するには、「CloudWatch Logs のクォータ」を参照してください。
CloudWatch Logs サービスのクォータを管理する
AWS では、パフォーマンスを保護し、可用性を確保するために、サービスのクォータを定義しています。CloudWatch には、メトリクス、アラーム、API リクエスト、アラームメール通知にクォータが適用されます。サービスクォータを確認し、しきい値に達したときにアラームを設定するには、次の手順を実行します。
- Service Quotas コンソールを開きます。
- ナビゲーションペインで [AWS サービス] を選択します。
- AWS サービスリストから、Amazon CloudWatch logs を検索します。
- [サービスクォータ] リストには、サービスクォータ名、適用される値 (該当する場合)、AWS のデフォルトクォータ、クォータ値が調整可能かどうかなど、いくつかの属性またはオプションが表示されます。
- サービスクォータの詳細情報を確認するには、クォータ名を選択します。たとえば、[GetLogEvents のスロットル制限 (1 秒あたりのトランザクション数)] を選択すると、次の項目が表示されます。
説明
クォータコード
クォータ ARN
**使用率:% **
適用クォータ値
AWS のデフォルトクォータ値
調整可能: Y/N
- [Amazon CloudWatch] アラームセクションで、[アラームを作成] を選択し、[アラームのしきい値] と [アラーム名] を入力します。
関連情報
CloudWatch API で PutMetricData を呼び出すときにスロットリングを回避する方法を教えてください