如何決定 CloudWatch 日誌中的調節?
上次更新日期:2022 年 4 月 6 日
當我在使用 Amazon CloudWatch Logs 時,收到了 RequestLimitExceeded 或 ThrottlingException 錯誤,而且我的 API 呼叫受到調節。如何防止我的 CloudWatch 日誌中發生調節?
簡短描述
使用 CloudWatch 日誌時,您可能會超出 API 速率限制。發生這種情況時,您會收到 RequestLimitExceeded 或 ThrottlingException 錯誤,而且您的 API 呼叫會受到調節。您必須找出發生調節的位置和時間,以便解決這些錯誤並提出知情的提高速率限制請求。
解決方案
存取日誌時 CloudWatch 日誌發生間歇性調節
您可以使用 FilterLogEvents 或 GetLogEvents API 呼叫,列出您的日誌事件或日誌串流。這些 API 呼叫具有硬限制,且沒有提高限制的資格。這表示如果您使用 FilterLogEvents API 從指定日誌群組搜尋日誌事件時,預設 quaAPI 的預設配額為每個帳戶/區域每秒 5 筆異動 (TPS)。如果達到此限制,您就會收到 RateExceeded 錯誤。
使用這些最佳實務來避免在此使用案例中的調節錯誤:
- 使用訂閲篩選條件立即從 CloudWatch 日誌中即時檢索日誌資料。如需詳細資訊,請參閲使用 CloudWatch Logs 訂閲篩選條件和利用訂閲即時處理日誌資料。
- 使用 CloudWatch 日誌洞察快速取得 CloudWatch 日誌的日誌資料。您可以使用查詢來篩選日誌,以查看特定的日誌群組。
- 將日誌資料匯出至 Amazon Simple Storage Service (Amazon S3),用於批次使用案例。不建議使用此方法進行即時分析和處理,因為最長可能需要 12 小時才能從 CloudWatch 日誌匯出日誌資料。
使用應用程式/腳本擷取 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。如需詳細資訊,請參閲設定適用於 AWS Splunk 附加元件的 Kinesis 輸入。
將 PutLogEvents API 呼叫與 Lambda 函數整合時的調節錯誤
使用 PutLogEvents API 呼叫以 1 MB 的批次將日誌上傳到指定的日誌串流。此 API 具有兩個速率限制:
- 每個日誌串流每秒 5 個請求。額外的請求將受到調節。此配額不能變更。
- 每個區域每個帳戶每秒 800 筆異動。此適用於各區域,但以下區域除外:美國東部 (維吉尼亞北部)、美國西部 (奧勒岡) 和歐洲 (愛爾蘭),這些區域的配額為每個區域每個帳戶每秒 1500 筆異動。您可以請求提高配額。
如需與此有關的詳細資訊,以及若要請求提高配額,請參閲 CloudWatch Logs 配額 。
若要將日誌寫入指定的日誌串流,必須在請求中納入順序字符。這是對前一次呼叫的回覆中的最後一次擷取。在某些情況下,您可以在呼叫 PutLogEvent 之前使用 DescribeLogStreams API 取得日誌串流的下一個順序字符。PutLogEvent API 具有比 DescribeLogsStream 高很多的限制,這會導致調節。若要減緩此情況,使用 PutLogEvents API 來取得順序,不要使用 DescribeLogStreams。當您在沒有順序字符的情況下使用 PutLogEvents API 時,您會收到 400 狀態代碼,但有了此錯誤訊息,您會得到下一個順序字符。您可以再次將此順序字符與 PutLogEvents API 搭配使用。
使用這些提示來避免在此使用案例中的調節:
- 嘗試在同一個 API 呼叫中組合多筆日誌事件。
- 將 API 呼叫分散到更多日誌串流中。
- 應用重試邏輯搭配指數退避和抖動。如需詳細資訊,請參閲管理和監控工作負載中的 API 調節。
- 隨時間均勻地分配您的 API 呼叫。
管理您的 CloudWatch Logs 服務配額
AWS 為服務定義配額,以保護效能並確保可用性。CloudWatch 具有指標、警示、API 請求和警示電子郵件通知等配額。使用這些步驟將服務配額視覺化,並設定達到閾值時的警示:
- 開啟 Service Quotas 主控台。
- 在導覽窗格中,選擇 AWS services (AWS 服務)。
- 從 AWS services (AWS 服務) 清單中,搜尋 Amazon CloudWatch logs (Amazon CloudWatch 日誌)。
- 在 Service quotas (服務配額) 清單中,您可以看到服務配額名稱、套用的值(如果有)、AWS 預設配額以及配額值是否可調整。
- 若要查看諸如描述等有關服務配額的詳細資訊,請選擇配額名稱。
- 選擇配額名稱後,您可以看到有關此配額的詳細資訊。例如,如果您選擇 GetLogEvents throttle limit in transactions per second (以每秒異動數為單位的 GetLogEvents 調節限制),則會看到:
- 描述
- 配額代碼
- 配額 ARN
- 利用率:%
- 套用的配額值
- AWS 預設配額值
- 可調整:是/否
- 在 Amazon CloudWatch alarms (Amazon CloudWatch 警示) 部分,選擇 Create alarm (建立警示),然後輸入 Alarm threshold (警示閾值) 和 Alarm name (警示名稱)。