

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

# Amazon EventBridge 排程器故障診斷
<a name="troubleshooting"></a>

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

**Topics**
+ [我的排程失敗，並出現目標錯誤](#troubleshooting-target-errors)
+ [排程執行角色許可問題](#troubleshooting-perms)
+ [了解和管理服務配額](#troubleshooting-quotas)
+ [排程模式和觸發計時問題](#troubleshooting-timing)
+ [建立排程模式和 Cron 表達式](#troubleshooting-patterns)
+ [我的目標是否被觸發？](#troubleshooting-trigger-target)
+ [範本化與通用目標](#troubleshooting-temp-universal-target)
+ [無效的通用目標輸入組態](#troubleshooting-usi-target-input)
+ [觸發非預期調用的排程更新](#troubleshooting-temp-universal-target-invoke)
+ [停用或啟用一次性排程](#troubleshooting-temp-universal-target-enable)

## 我的排程失敗，並出現目標錯誤
<a name="troubleshooting-target-errors"></a>

目標呼叫失敗是 EventBridge 排程器最常見的問題之一。發生這些失敗的原因有幾個：

### 常見原因：
<a name="troubleshooting-target-errors-cc"></a>
+ 遺失或不正確的目標參數。
+ 網路連線問題。
+ API 限流。
+ 目標組態不正確。

### 疑難排解步驟
<a name="troubleshooting-target-errors-solve"></a>

1. **設定無效字母佇列 (DLQ)**
   + DLQ 可協助您擷取和分析失敗的調用。
   + 失敗的調用會傳送至 DLQ，其中包含詳細的錯誤訊息。
   + 若要[設定 DLQ](configuring-schedule-dlq.md)，請將其新增至排程組態：

   ```
   {
       "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": "*"
   }
   ```

1. **驗證 API 參數**
   + 確保目標 API 呼叫的所有必要參數都存在且格式正確。
   + 檢查參數值是否在允許的範圍內。
   + 如果使用 VPC 端點，請確認可從 VPC 存取 API 端點。

1. **檢閱網路組態**
   + 如果呼叫因暫時性網路問題而失敗，請實作[重試](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_RetryPolicy.html)邏輯。
   + 重試政策範例：

   ```
   {
       "RetryPolicy": {
           "MaximumRetryAttempts": 3,
           "MaximumEventAgeInSeconds": 3600
       }
   }
   ```

1. **檢查目標特定的組態**
   + 對於範本目標 （例如 ECS 任務），請確保您透過排程建立 API 的 `Target.Input` 參數提供覆寫。
   + 確認您的目標服務受到[支援](managing-targets-templated.md)且設定正確。

## 排程執行角色許可問題
<a name="troubleshooting-perms"></a>

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

### 常見原因
<a name="troubleshooting-perms-cc"></a>
+ 缺少目標服務所需的許可
+ 排程中的角色組態不正確
+ 缺少與 EventBridge 排程器服務的信任關係
+ 存取加密資源的許可不足

### 徵狀
<a name="troubleshooting-perms-symptoms"></a>
+ 增加 CloudWatch `TargetErrorCount` 中的指標
+ 排程無法在排程組態中沒有明顯問題的情況下執行

### 疑難排解步驟
<a name="troubleshooting-perms-solve"></a>

1. **監控 CloudWatch 指標**
   + 檢查 CloudWatch 中的 `TargetErrorCount` 指標。

1. **使用無效字母佇列 (DLQ) 確認許可問題**
   + 為您的排程設定 DLQ。
   + 如果您的目標有許可問題，且 DLQ 已正確設定，則您會在 DLQ 中看到失敗的調用，其中包含許可相關的錯誤訊息。
   + 如果即使 CloudWatch 指標中顯示的執行失敗，DLQ 仍然空白，這可能表示許可問題，導致 EventBridge 排程器無法寫入 DLQ 本身。
**注意**  
確保 DLQ 本身具有正確的許可。如果加密，請確定 EventBridge 排程器具有使用 KMS 金鑰的許可。

1. **驗證信任關係**
   + 確保您的 IAM 角色與 EventBridge 排程器具有正確的信任關係：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [{
           "Effect": "Allow",
           "Principal": {
               "Service": "scheduler.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
       }]
   }
   ```

1. **檢查排程執行角色許可**
   + 排程的執行角色需要特定許可，才能叫用不同的目標類型。
   + 包含在排程執行角色政策中的許可範例：

   ```
   // 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"
       }]
   }
   ```

1. **檢查加密的資源存取**
   + 如果您的目標使用加密的資源 （例如 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"
           }
       ]
   }
   ```

1. **驗證角色 ARN 組態**
   + 確保排程組態中的角色 ARN 正確無誤。
   + 驗證角色與您的排程位於相同的 AWS 帳戶 和 區域中。

## 了解和管理服務配額
<a name="troubleshooting-quotas"></a>

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

### 識別配額問題
<a name="troubleshooting-quotas-symptoms"></a>

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

1. **監控 CloudWatch 指標**
   + 檢查 `InvocationThrottleCount` 指標。此指標的增加表示您超過了調用率限制。
   + 檢閱 `InvocationAttemptCount` 指標以了解您目前的用量。

1. **注意特定錯誤訊息**
   + 建立或修改排程時， `LimitExceededException`表示您已達到排程或排程群組的數量上限。
   + API 呼叫傳回調節錯誤，表示您超過 API 請求配額。

### 解決配額問題
<a name="troubleshooting-quotas-solve"></a>

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

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

1. 針對 API 限流，請在 API 呼叫中實作[具有退避的重試](https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/retry-backoff.html)。

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

## 排程模式和觸發計時問題
<a name="troubleshooting-timing"></a>

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

### 常見原因
<a name="troubleshooting-timing-cc"></a>
+ cron 表達式的錯誤解譯。
+ 在日光節約時間變更期間的非預期行為。
+ 關於彈性時段的混淆。
+ 對速率表達式的誤解。

### 疑難排解步驟
<a name="troubleshooting-timing-solve"></a>

1. **驗證 cron 表達式**
   + 確保您的 Cron 表達式格式正確。
   + 請注意，您無法在 Cron 表達式中同時指定day-of-month和day-of-week欄位。

1. **時區考量**
   + 在建立排程時選取您偏好的時區。
   + 了解日光節約時間如何影響您的排程，因為此調整是以 UTC 為基礎。

   日光節約影響的範例：如果您設定排程在 GMT 上午 7：00 執行：
   + 冬天：排程在 GMT 上午 7：00 執行 （因為 GMT = UTC)
   + 在夏天：排程仍會在 UTC 上午 7：00 執行，現在是 GMT/BST 上午 6：00

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

1. **了解彈性時段**
   + [彈性時段](managing-schedule-flexible-time-windows.md)允許 EventBridge 排程器最佳化調用。
   + 排程可能不會在視窗開始時完全觸發。
   + 監控實際調用時間，以了解行為。

1. **檢閱速率和 Cron 表達式**
   + 確保速率表達式格式正確 （例如 `rate(5 minutes)`、 `rate(1 hour)`)。
   + 對於速率和 Cron 表達式，請注意，排程調用不會緊固到一分鐘的第 0 秒。
   + 排程可能會在指定的分鐘內觸發，但不一定會在分鐘的確切開始時觸發。

   例如：
   + 使用 的排程`rate(1 hour)`可能會在下午 2：00：45、下午 3：00：32、下午 4：00：18 等時間執行。
   + (`0 * * * ? *`每小時） 的 Cron 排程可能會在下午 2：00：15、下午 3：00：07、下午 4：00：52 等時間執行。

1. **監控 CloudWatch 指標**
   + 使用 `InvocationAttemptCount` 指標來驗證您的排程是否正在觸發。
   + 檢查調用`TargetErrorCount`是否失敗。
   + 如果您已設定無效字母佇列，請監控 `InvocationsSentToDeadLetterCount`以追蹤失敗的呼叫。

## 建立排程模式和 Cron 表達式
<a name="troubleshooting-patterns"></a>

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

### 常見問題
<a name="troubleshooting-patterns-cc"></a>
+ 不正確的 cron 語法
+ 嘗試使用不支援的 cron 功能
+ 混淆哪些欄位可以一起使用

### 疑難排解步驟
<a name="troubleshooting-patterns-solve"></a>

1. **檢閱 cron 表達式語法**
   + 確保您的 Cron 表達式遵循正確的[格式](schedule-types.md#cron-based)：`Minutes Hours Day-of-month Month Day-of-week Year`。
   + 請記住，EventBridge 排程器使用 cron 標準搭配額外的年份欄位。

1. **了解限制**
   + 您無法同時指定day-of-month和day-of-week欄位，如[此處](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html#eb-cron-expressions)所述。
   + 不支援頻率多於 1 分鐘的 Cron 表達式。

1. **使用排程預覽功能**
   + 建立或編輯排程時，EventBridge 排程器會提供接下來 10 個執行時間的預覽。
   + 使用此預覽來確認您的排程將在預定時間執行。
   + 如果預覽不符合您的期望，請檢閱和調整您的 Cron 表達式。

## 我的目標是否被觸發？
<a name="troubleshooting-trigger-target"></a>

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

1. 檢查 CloudWatch 指標：
   + `InvocationAttemptCount` 顯示嘗試的調用次數
   + `TargetErrorCount` 指出是否有任何調用失敗
   + `TargetErrorThrottledCount` 顯示您的目標是否正在調節
   + `InvocationDroppedCount` 指出是否已捨棄任何調用

1. [設定無效字母佇列 ](configuring-schedule-dlq.md)(DLQ) 以擷取和分析任何失敗的調用。

## 範本化與通用目標
<a name="troubleshooting-temp-universal-target"></a>

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

若要解決此問題：

1. 檢查所需的服務是否支援做為[範本化目標](managing-targets-templated.md)。

1. 如果不支援，請改用[通用目標](managing-targets-universal.md)，並將其設定為對服務進行適當的 API 呼叫。

## 無效的通用目標輸入組態
<a name="troubleshooting-usi-target-input"></a>

當您使用[通用目標](managing-targets-universal.md)建立排程時，EventBridge 排程器會驗證目標 ARN 格式，但不會針對下游服務的 API 驗證 `Input` 欄位的內容。這表示即使 `Input`包含目標服務在調用時將拒絕的值，也可以成功建立排程。

具有無效目標輸入組態的排程會在其設定的表達式上觸發，但每次調用都會失敗。在調用排程之前，您可能不會發現組態錯誤，這可能是建立後的數小時或數天。

### 徵狀
<a name="troubleshooting-usi-target-input-symptoms"></a>
+ 排程建立時不會發生錯誤，但 `TargetErrorCount` CloudWatch 指標會在每次調用時增加。
+ DLQ 訊息包含來自目標服務的錯誤代碼 （例如， `InvalidParameterValueException`或 `ValidationException`)，而非 `AWS.Scheduler.InternalServerError`。
+ DLQ 訊息`ERROR_MESSAGE`中的 參考特定的輸入參數驗證失敗。

### 範例
<a name="troubleshooting-usi-target-input-examples"></a>

下列範例顯示通用目標的常見無效輸入組態 AWS Lambda (`arn:aws:scheduler:::aws-sdk:lambda:invoke`)。

**不符的限定詞**

具有下列輸入的排程會在 `2`中指定版本，`FunctionName`並在 `1` `Qualifier` 欄位中指定版本：

```
{
    "FunctionName": "MyFunction:2",
    "Qualifier": "1"
}
```

此排程已成功建立，但每次調用都會失敗。DLQ 訊息包含：
+ `ERROR_CODE`: `InvalidParameterValueException`
+ `ERROR_MESSAGE`: `The derived qualifier from the function name does not match the specified qualifier.`

**無效的函數名稱**

具有下列輸入的排程會指定 的空格限定值`FunctionName`：

```
{
    "FunctionName": "     "
}
```

DLQ 訊息包含：
+ `ERROR_CODE`: `ValidationException`
+ `ERROR_MESSAGE`：表示函數名稱與所需模式不相符的驗證錯誤。

### 如何解決
<a name="troubleshooting-usi-target-input-resolve"></a>

1. **設定 DLQ。**一律為使用通用目標的排程[設定無效字母佇列](configuring-schedule-dlq.md)。DLQ 訊息屬性 (`ERROR_CODE` 和 `ERROR_MESSAGE`) 包含目標服務傳回的特定錯誤，可識別無效的輸入參數。

1. **根據目標服務 API 驗證輸入參數。**建立排程之前，請直接呼叫目標 API，確認`Input`欄位中的 JSON 是否包含有效的值。例如，使用 AWS Lambda `Invoke` API 以相同的參數叫用 AWS Lambda 函數，以確認請求成功。

1. **使用一次性排程進行測試。**建立一次性排程，以在設定週期性排程之前驗證目標調用是否成功。

1. **檢閱目標服務 API 參考。**檢查您目標服務的 API 參考，以確認所需的參數、有效值範圍和限制條件。如需 AWS Lambda `Invoke`，請參閱《 *AWS Lambda 開發人員指南*》中的[叫用](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)。

## 觸發非預期調用的排程更新
<a name="troubleshooting-temp-universal-target-invoke"></a>

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

## 停用或啟用一次性排程
<a name="troubleshooting-temp-universal-target-enable"></a>

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

例如：
+ 目前時間：13：15 UTC
+ 為 建立一次性排程：13：30 UTC
+ 在 UTC 13：30 之前停用排程
+ 排程在 UTC 14：00 重新啟用
+ 結果：重新啟用時可立即叫用目標