Amazon EventBridge 排程器故障診斷 - EventBridge 排程器

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon EventBridge 排程器故障診斷

您可以使用本節中的主題來疑難排解常見的 Amazon EventBridge 排程器問題。

我的排程失敗,並出現目標錯誤

目標呼叫失敗是 EventBridge 排程器最常見的問題之一。這些失敗可能有多種原因:

常見原因:

  • 遺失或不正確的目標參數。

  • 網路連線問題。

  • API 限流。

  • 目標組態不正確。

疑難排解步驟

  1. 設定無效字母佇列 (DLQ)

    • DLQ 可協助您擷取和分析失敗的調用。

    • 失敗的調用會傳送至 DLQ,其中包含詳細的錯誤訊息。

    • 若要設定 DLQ,請將其新增至您的排程組態:

    { "DeadLetterConfig": { "Arn": "arn:aws:sqs:region:account-id:MyDLQ" } }

    注意:如果您的 DLQ 使用 KMS 金鑰加密,請確定金鑰政策允許 EventBridge 排程器使用它:

    { "Sid": "Allow EventBridge Scheduler to use the key", "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }
  2. 驗證 API 參數

    • 確保目標 API 呼叫的所有必要參數都存在且格式正確。

    • 檢查參數值是否在允許的範圍內。

    • 如果使用 VPC 端點,請確認可從 VPC 存取 API 端點。

  3. 檢閱網路組態

    • 如果呼叫因暫時性網路問題而失敗,請實作重試邏輯。

    • 重試政策範例:

    { "RetryPolicy": { "MaximumRetryAttempts": 3, "MaximumEventAgeInSeconds": 3600 } }
  4. 檢查目標特定的組態

    • 對於範本目標 (例如 ECS 任務),請確保您透過排程建立 API 的 Target.Input 參數提供覆寫。

    • 確認您的目標服務受到支援且設定正確。

排程執行角色許可問題

IAM 角色許可問題是排程執行失敗的常見原因。以下是疑難排解和解決這些問題的方法:

常見原因

  • 缺少目標服務所需的許可

  • 排程中的角色組態不正確

  • 缺少與 EventBridge 排程器服務的信任關係

  • 存取加密資源的許可不足

徵狀

  • 在 CloudWatch TargetErrorCount 中增加指標

  • 排程無法在排程組態中沒有明顯問題的情況下執行

疑難排解步驟

  1. 監控 CloudWatch 指標

    • 檢查 CloudWatch 中的 TargetErrorCount 指標。

  2. 使用無效字母佇列 (DLQ) 確認許可問題

    • 為您的排程設定 DLQ。

    • 如果您的目標有許可問題,且 DLQ 已正確設定,則您會在 DLQ 中看到失敗的調用,其中包含許可相關的錯誤訊息。

    • 如果即使 CloudWatch 指標中顯示的執行失敗,DLQ 仍然空白,這可能表示許可問題,導致 EventBridge 排程器無法寫入 DLQ 本身。

    注意

    確保 DLQ 本身具有正確的許可。如果加密,請確定 EventBridge 排程器具有使用 KMS 金鑰的許可。

  3. 驗證信任關係

    • 確保您的 IAM 角色與 EventBridge 排程器具有正確的信任關係:

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" }] }
  4. 檢查排程執行角色許可

    • 排程的執行角色需要特定許可,才能叫用不同的目標類型。

    • 包含在排程執行角色政策中的範例許可:

    // For Lambda function targets - add to schedule execution role { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" }] } // For SQS queue targets - add to schedule execution role { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "sqs:SendMessage" ], "Resource": "arn:aws:sqs:region:account-id:queue-name" }] }
  5. 檢查加密的資源存取

    • 如果您的目標使用加密的資源 (例如 KMS 加密的 SQS 佇列),請確定您的角色具有使用 KMS 金鑰的許可:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:region:account-id:key/key-id" } ] }
  6. 驗證角色 ARN 組態

    • 確保排程組態中的角色 ARN 正確無誤。

    • 確認角色與您的排程位於相同的 AWS 帳戶 和 區域中。

了解和管理服務配額

如果您在建立排程或查看節制調用時遇到問題,您可能會達到服務配額限制。EventBridge 排程器具有排程數量、排程群組和調用率的配額,可能因區域而異。

識別配額問題

若要判斷您是否達到配額限制:

  1. 監控 CloudWatch 指標

    • 檢查 InvocationThrottleCount 指標。此指標的增加表示您超過調用率限制。

    • 檢閱 InvocationAttemptCount 指標以了解您目前的用量。

  2. 注意特定錯誤訊息

    • 建立或修改排程時, LimitExceededException表示您已達到排程或排程群組的數量上限。

    • API 呼叫傳回調節錯誤,表示您超過 API 請求配額。

解決配額問題

如果您確定要達到配額限制:

  1. 檢閱並最佳化您目前的排程。請考慮合併類似的排程或移除未使用的排程。

  2. 針對 API 限流,請在 API 呼叫中實作具有退避的重試

  3. 如果您需要更高的配額,請透過 Service Quotas 主控台請求提高配額。選取 EventBridge 排程器,選擇您需要增加的配額,然後提交具有業務理由的請求。

排程模式和觸發計時問題

使用者有時會遇到排程未在預期時間觸發的問題。這最常見的原因是對排程模式、日光節約時間變更或彈性時段的誤解。

常見原因

  • cron 表達式的錯誤解譯。

  • 在日光節約時間變更期間的非預期行為。

  • 關於彈性時段的混淆。

  • 對速率表達式的誤解。

疑難排解步驟

  1. 驗證 cron 表達式

    • 確保您的 Cron 表達式格式正確。

    • 請注意,您無法在 Cron 表達式中同時指定day-of-month和day-of-week欄位。

  2. 時區考量

    • 在建立排程時選取您偏好的時區。

    • 了解日光節約時間如何影響您的排程,因為此調整是以 UTC 為基礎。

    日光節約影響的範例:如果您將排程設定為在 GMT 上午 7:00 執行:

    • 冬天:排程在 GMT 上午 7:00 執行 (因為 GMT = UTC)

    • 在夏天:排程仍然在 UTC 上午 7:00 執行,現在是 GMT/BST 上午 6:00

    如果您需要在全年的相同當地時間執行排程,請務必在建立排程時選取適當的時區,以及日光節約如何影響該時區。

  3. 了解彈性時段

    • 彈性時段允許 EventBridge 排程器最佳化調用。

    • 排程可能不會在視窗開始時完全觸發。

    • 監控實際調用時間,以了解行為。

  4. 檢閱速率和 Cron 表達式

    • 確保速率表達式格式正確 (例如 rate(5 minutes)rate(1 hour))。

    • 對於速率和 Cron 表達式,請注意,排程調用不會緊固到一分鐘的第 0 秒。

    • 排程可能會在指定的分鐘內觸發,但不一定會在分鐘的確切開始時觸發。

    例如:

    • 使用 的排程rate(1 hour)可能會在下午 2:00:45、下午 3:00:32、下午 4:00:18 等時間執行。

    • 為 設定的 Cron 排程 0 * * * ? *(每小時) 可能會在下午 2:00:15、下午 3:00:07、下午 4:00:52 等時間執行。

  5. 監控 CloudWatch 指標

    • 使用 InvocationAttemptCount 指標來驗證您的排程是否正在觸發。

    • 檢查調用TargetErrorCount是否失敗。

    • 如果您已設定無效字母佇列,請監控 InvocationsSentToDeadLetterCount以追蹤失敗的呼叫。

建立排程模式和 Cron 表達式

使用者經常在建立排程模式時遇到問題,特別是使用 Cron 表達式時。以下是一些常見問題以及如何解決這些問題:

常見問題

  • 不正確的 cron 語法

  • 嘗試使用不支援的 cron 功能

  • 混淆哪些欄位可以一起使用

疑難排解步驟

  1. 檢閱 cron 表達式語法

    • 確保您的 Cron 表達式遵循正確的格式Minutes Hours Day-of-month Month Day-of-week Year

    • 請記住,EventBridge 排程器使用 cron 標準搭配額外的年份欄位。

  2. 了解限制

    • 您無法同時指定day-of-month和day-of-week欄位,如此處所述。

    • 不支援頻率多於 1 分鐘的 Cron 表達式。

  3. 使用排程預覽功能

    • 建立或編輯排程時,EventBridge 排程器會提供接下來 10 個執行時間的預覽。

    • 使用此預覽來驗證您的排程將在預定時間執行。

    • 如果預覽不符合您的期望,請檢閱和調整您的 Cron 表達式。

我的目標是否被觸發?

若要確認您的目標是否正在觸發:

  1. 檢查 CloudWatch 指標:

    • InvocationAttemptCount 顯示嘗試的調用次數

    • TargetErrorCount 指出是否有任何調用失敗

    • TargetErrorThrottledCount 顯示您的目標是否正在調節

    • InvocationDroppedCount 指出是否已捨棄任何調用

  2. 設定無效字母佇列 (DLQ) 以擷取和分析任何失敗的調用。

範本化與通用目標

如果您收到「提供的請求無效:【服務】 不是目標支援的 服務」之類的錯誤,您可能嘗試使用不支援的服務做為範本化目標。

若要解決此問題:

  1. 檢查所需的服務是否支援做為範本化目標

  2. 如果不支援,請改用通用目標,並將其設定為對服務進行適當的 API 呼叫。

觸發非預期調用的排程更新

當您變更排程時,調用可能不會立即反映更新的排程。允許一小段時間來讓變更生效。例如,如果您更新接近其原始觸發時間的排程,您可能會根據原始排程組態看到 呼叫。

停用或啟用一次性排程

在超過原始排程時間後重新啟用一次性排程時,排程可能會立即叫用其目標。即使排程在原始執行時間之前已停用,也會發生這種情況。

例如:

  • 目前時間:13:15 UTC

  • 為 建立一次性排程:13:30 UTC

  • 在 UTC 13:30 之前停用排程

  • 排程在 UTC 14:00 重新啟用

  • 結果:重新啟用時可立即叫用目標