當我在使用 Amazon CloudWatch Logs 時,收到了 "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 呼叫時,使用指數退避和重試。如需更多資訊,請參閲指數退避和抖動和 AWS 中的錯誤重試和指數退避。
- 隨時間分配您的 API 呼叫。使用一些隨機化來安排動作,使其能散布在一段時間上。
- 在連續 API 呼叫之間加入休眠間隔時間。在從同一指令碼或應用程式發送的 API 呼叫之間加入一些延遲。如果您傳送的 API 呼叫都是快速連續發送,則更有可能導致速率錯誤。
- 在某些情況下,您可以使用像 Splunk 之類的 SIEM 解決方案從 CloudWatch 擷取日誌。使用 SIEM 解決方案從多個系統收集資料並分析這些資料以偵測異常行為。當您使用 Splunk 外掛程式時,您可能會遭遇到 API 限流。為避免此問題,使用 Amazon Kinesis Data Firehose 建立一個 CloudWatch 日誌訂閲篩選條件,並將日誌資料傳遞至 Splunk。如需詳細資訊,請參閲 Splunk 文件的設定適用於 AWS Splunk 附加元件的 Kinesis 輸入。
將 PutLogEvents API 呼叫與 Lambda 函數整合時的限流錯誤
使用 PutLogEvents API 呼叫以 1 MB 的批次將日誌上傳到指定的日誌串流。此 API 的速率限制為每個帳戶每個區域 800 TPS。此適用於各區域,但以下區域除外:美國東部 (維吉尼亞北部)、美國西部 (奧勒岡) 和歐洲 (愛爾蘭),這些區域的配額為每個區域每個帳戶 1500 TPS。您可以請求提高配額。
如需與此有關的詳細資訊,以及若要請求提高配額,請參閲 CloudWatch Logs 配額。
管理您的 CloudWatch Logs 服務配額
AWS 為服務定義配額,以保護效能並確保可用性。CloudWatch 具有指標、警示、API 請求和警示電子郵件通知等配額。使用這些步驟將服務配額視覺化,並設定達到閾值時的警示:
1. 開啟 Service Quotas 主控台。
2. 在導覽窗格中,選擇 AWS services (AWS 服務)。
3. 從 AWS services (AWS 服務) 清單中,搜尋 Amazon CloudWatch Logs。
4. Service quotas (服務配額) 清單會向您顯示數個屬性或選項:服務配額名稱、套用的值(如果有)、AWS 預設配額以及配額值是否可調整。
5. 若要檢視諸如描述等有關服務配額的詳細資訊,請選擇配額名稱。
6. 選擇配額名稱後,您可以看到有關此配額的詳細資訊。例如,如果您選擇 GetLogEvents throttle limit in transactions per second (以每秒異動數為單位的 GetLogEvents 調節限制),您會看到下列項目:
描述
配額代碼
配額 ARN
利用率:%
套用的配額值
AWS 預設配額值
可調整:是/否
7. 在 Amazon CloudWatch alarms (Amazon CloudWatch 警示) 部分,選擇 Create alarm (建立警示),然後輸入 Alarm threshold (警示閾值) 和 Alarm name (警示名稱)。
相關資訊
在 CloudWatch API 中呼叫 PutMetricData 時如何避免限流?