

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 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 端点，请验证 API 端点是否可从您的 VPC 访问。

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>
+ 增加了`TargetErrorCount`指标 CloudWatch
+ 调度无法执行，调度配置中没有明显问题

### 故障排除步骤
<a name="troubleshooting-perms-solve"></a>

1. **监控 CloudWatch 指标**
   + 查看`TargetErrorCount`指标 CloudWatch。

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. 如果需要更高的配额，可以通过服务配额控制台请求增加配额。选择 EventBridge Scheduler，选择需要增加的配额，然后提交包含您的业务理由的申请。

## 调度模式和触发时机问题
<a name="troubleshooting-timing"></a>

用户有时会遇到调度无法在预期时间触发的问题。这通常是由于对调度模式的理解偏差、夏令时变更或灵活时间窗口导致的。

### 常见原因
<a name="troubleshooting-timing-cc"></a>
+ 对 cron 表达式的误解。
+ 夏令时切换期间出现意外行为。
+ 对灵活时间窗口存在理解混淆。
+ 对 rate 表达式的误解。

### 故障排除步骤
<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 运行，该时间现在是格林威治标准时间/英国夏令时间上午 6:00

   如果您需要调度全年按相同本地时间运行，请在创建调度时选择合适的时区，并留意夏令时对该时区的影响。

1. **了解灵活时间窗口**
   + [灵活的时间窗口](managing-schedule-flexible-time-windows.md)允许 EventBridge 调度器优化调用。
   + 调度可能不会在窗口的起始时刻准时触发。
   + 监控实际调用时间以了解相关行为。

1. **查看 rate 和 cron 表达式**
   + 确保 rate 表达式的格式正确（例如 `rate(5 minutes)`、`rate(1 hour)`）。
   + 对于 rate 和 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. **了解局限性**
   + 您不能像[此处](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html#eb-cron-expressions)所讨论的那样同时指定 day-of-month和 day-of-week字段。
   + 不支持产生的速率快于 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>

如果您收到诸如“Invalid request provided: [service] is not a supported service for a target”之类的错误，则您可能正在尝试使用不支持的服务作为模板化目标。

要解决这一问题，请执行以下操作：

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`) 的常见无效输入配置。

**预选赛不匹配**

具有以下输入的计划在`Qualifier`字段`2`中指定版本`FunctionName`和版本`1`：

```
{
    "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
+ 已为以下时间创建一次性调度：UTC 时间 13:30
+ 调度已于 UTC 时间 13:30 之前被禁用
+ 调度已于 UTC 时间 14:00 重新启用
+ 结果：目标可以在重新启用后立即被调用