當我使用 Amazon CloudWatch 日誌時,我會收到「RequestLimitExceeded」或「ThrottlingException」錯誤,且我的 API 調用被限流。
簡短說明
當您使用 CloudWatch 日誌時,您可能會超過 API 率配額。發生這種情況時,您的 API 呼叫會被限流,並且您會收到 RequestLimitExceed 或 ThrottlingException 錯誤。若要解決這些錯誤,請確定限流錯誤發生的位置和時間。然後,提出明智的率配額增加請求。
解決方法
存取日誌時 CloudWatch 日誌間歇性限流錯誤
若要列出日誌事件或日誌串流,請使用 FilterLogEvents 或 GetLogEvents API 呼叫。這些 API 呼叫不符合增加配額的資格。但是,當您使用 FilterLogEvents API 從指定的日誌群組搜尋日誌事件時,會有一個配額。每個 AWS 帳戶或 AWS 區域的配額為每秒五次交易 (TPS)。如果您達到此配額,則會收到 RateExceeded 錯誤。
為了避免這些限流錯誤,請使用訂閱篩選器即時從 CloudWatch 日誌擷取日誌資料。如需詳細資訊,請參閱日誌群組層級訂閱篩選條件和透過訂閱即時處理日誌資料。
這也是使用 CloudWatch 日誌洞察來快速從 CloudWatch 日誌取得日誌資料的最佳實務。若要檢視特定的日誌群組,請使用查詢篩選日誌。請確保為批次使用案例,將日誌資料匯出至 Amazon Simple Storage Service (Amazon S3)。
**注意:**日誌資料最多可能需要 12 個小時才能處理,然後才能從 CloudWatch 日誌匯出資料。使用此方法進行即時分析和處理並不是最佳實務。
使用指令碼擷取 CloudWatch 日誌資料時發生 ThrottlingException 錯誤
若要收集 CloudWatch 日誌,您可以開發收集器指令碼。若要從相同的日誌群組中的不同日誌串流或不同時間範圍擷取資料,請建立執行 DescribeLogStreams 或 GetLogEvents API 呼叫的指令碼。但是,API 呼叫,例如 FilterLogEvents、GetLogEvents 和 DescribeLogStreams 是為人類互動而設計的,而不是用於自動化。如果您在指令碼中使用這些 API,則 API 呼叫會受到限流,並且您會收到錯誤。
若要避免在此使用案例中的限流錯誤,請在進行 API 呼叫時使用指數退避並重試。如需詳細資訊,請參閱指數退避和抖動和重試行為。確保隨時間的推移分佈 API 呼叫。使用隨機化排程動作,以便它們在一段時間內分散。
如果快速連續發送 API 呼叫,則可能會導致率錯誤。為避免此問題,請在連續 API 呼叫之間新增睡眠間隔。此外,在相同指令碼或應用程式發送的 API 調用之間新增延遲。
當您使用安全資訊和事件管理 (SIEM) 解決方案 (例如 Splunk) 從 CloudWatch 擷取日誌時,Splunk 外掛程式可能會導致 API 限流錯誤。若要避免此問題,請使用 Amazon Data Firehose 建立 CloudWatch 日誌訂閱篩選條件。然後,將日誌資料傳遞給 Splunk。如需詳細資訊,請參閱 Splunk 網站上的 Amazon Web 服務 Splunk 附加元件簡介。
將 PUTLogEvents API 呼叫與 Lambda 函數整合時的限流錯誤
當您將 PUTLogEvents API 呼叫與 AWS Lambda 函數整合時,PutLogEvents 會以 1 MB 的批次上傳日誌至指定的日誌串流。此 API 的率配額為每秒,每個帳戶,每個區域 5000 次。
如需詳細資訊並要求增加配額,請參閱 CloudWatch 日誌配額。
管理您的 CloudWatch 日誌服務配額
AWS 定義服務配額,以保護效能並確保可用性。CloudWatch 具有指標、警示、API 請求和警示電子郵件通知的配額。若要查看您的服務配額,並在達到臨界值時設定警示,請完成下列步驟:
- 開啟 Service Quotas 主控台。
- 在導覽窗格中,選擇 AWS 服務。
- 從 AWS 服務清單中搜尋 Amazon CloudWatch 日誌。
- 服務配額清單會顯示多個屬性或選項:服務配額名稱、套用的值 (如果可用)、AWS 預設配額,以及配額值是否可調整。
- 若要查看有關服務配額的詳細資訊,請選擇配額名稱。例如,如果您在每秒交易中選擇 GetLogEvents 限流限制,則會看到下列項目:
描述
配額程式碼
**配額 ARN **
**使用率:% **
**套用配額值 **
**AWS 預設配額值 **
**可調整: 是/否 **
- 在 Amazon CloudWatch 警示區段中,選擇建立警示,然後輸入警示臨界值和警示名稱。
相關資訊
當我呼叫 CloudWatch API 中的 PutMetricData 時如何避免限流?