

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

# 对亚马逊进行故障排除 EventBridge
<a name="eb-troubleshooting"></a>

您可以使用本节中的主题来解决 Amazon EventBridge 问题。

**提示**  
要验证您的事件模式是否与预期事件相匹配，您可以使用 EventBridge 沙盒根据示例事件测试事件模式。有关更多信息，请参阅 [使用 EventBridge 沙盒测试事件模式](eb-event-pattern-sandbox.md)。

**Topics**
+ [我的规则已运行，但 Lambda 函数没有被调用](#eb-lam-function-not-invoked)
+ [我刚刚创建或修改了规则，但它未能匹配测试事件](#eb-rule-does-not-match)
+ [我在 `ScheduleExpression` 中指定了时间，但我的规则没有运行](#eb-rule-did-not-trigger)
+ [我的规则未在我期望的时间运行](#eb-rule-did-not-trigger-on-time)
+ [我的规则与 AWS 全局服务 API 调用相匹配，但它没有运行](#eb-rule-did-not-trigger-iam)
+ [规则运行时，与我的规则关联的 IAM 角色被忽略](#eb-iam-role-ignored)
+ [我的规则的事件模式应该与某资源匹配，但未匹配事件](#eb-events-do-not-match-rule)
+ [向目标传送我的事件时存在延迟](#eb-delayed-event-delivery)
+ [某些事件从未传送到我的目标](#eb-never-delivered-to-target)
+ [我的规则在回应一个事件时多次运行](#eb-rule-triggered-more-than-once)
+ [防止无限循环](#eb-prevent-infinite-loops)
+ [我的事件没有传送到目标 Amazon SQS 队列](#eb-sqs-encrypted)
+ [我的规则可以运行，但未看到任何消息发布到我的 Amazon SNS 主题](#eb-no-messages-published-sns)
+ [EventBridge 即使我删除了与亚马逊 SNS 主题相关的规则，我的 Amazon SNS 主题仍然具有访问权限](#eb-sns-permissions-persist)
+ [我可以将哪些 IAM 条件键与之搭配使用 EventBridge？](#eb-supported-access-policies)
+ [我怎么知道什么时候 EventBridge 违反了规则？](#eb-create-alarm-broken-event-rules)

## 我的规则已运行，但 Lambda 函数没有被调用
<a name="eb-lam-function-not-invoked"></a>

您的 Lambda 函数无法运行的原因之一是您没有适当的权限。

**检查您对 Lambda 函数的权限**

1. 使用 AWS CLI，对您的函数和 AWS 区域运行以下命令：

   ```
   aws lambda get-policy --function-name MyFunction --region us-east-1
   ```

   您应当看到如下输出。

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
   "Condition": {
   "ArnLike": {
   "AWS:SourceArn": "arn:aws:events:us-east-1:123456789012:rule/rule-name"
   }
   },
   "Action": "lambda:InvokeFunction",
   "Resource": "arn:aws:lambda:us-east-1:123456789012:function:function-name",
   "Effect": "Allow",
   "Principal": {
   "Service": "events.amazonaws.com"
   },
   "Sid": "MyId"
   }
   ],
   "Id": "default"
   }
   ```

------

1. 如果您看到以下消息：

   ```
   A client error (ResourceNotFoundException) occurred when calling the GetPolicy operation: The resource you requested does not exist.
   ```

   或者，您看到输出，但无法将 events.amazonaws.com 定位为策略中的受信任实体，请运行以下命令：

   ```
   aws lambda add-permission \
   --function-name MyFunction \
   --statement-id MyId \
   --action 'lambda:InvokeFunction' \
   --principal events.amazonaws.com \
   --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
   ```

1. 如果输出包含 `SourceAccount` 字段，则需要删除该字段。`SourceAccount`设置会 EventBridge 阻止调用该函数。

**注意**  
如果策略不正确，则可以在 EventBridge 控制台中编辑该[规则](eb-rules.md)，方法是将其删除，然后将其重新添加到规则中。然后， EventBridge 控制台会为[目标](eb-targets.md)设置正确的权限。  
如果您使用特定的 Lambda 别名或版本，则必须在 `aws lambda get-policy` 和 `aws lambda add-permission` 命令中添加 `--qualifier` 参数，如以下命令所示   

```
aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
--qualifier alias or version
```

## 我刚刚创建或修改了规则，但它未能匹配测试事件
<a name="eb-rule-does-not-match"></a>

在更改[规则](eb-rules.md)或其[目标](eb-targets.md)后，传入[事件](eb-events.md)可能无法立即开始或停止与新的或更新后的规则的匹配。请稍等片刻，以便更改生效。

如果事件在短时间后仍然不匹配，请检查 CloudWatch 指标`TriggeredRules``Invocations`、和`FailedInvocations`是否符合您的规则。有关这些指标的更多信息，请参阅[监控 Amazon EventBridge](eb-monitoring.md)。

如果该规则旨在匹配来自 AWS 服务的事件，请执行以下操作之一：
+ 使用 `TestEventPattern` 操作来测试您的规则的事件模式是否与测试事件匹配。有关更多信息，请参阅 *Amazon EventBridge API 参考[TestEventPattern](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_TestEventPattern.html)*中的。
+ 在[EventBridge 主机](https://console.aws.amazon.com/events)上使用**沙盒**。

## 我在 `ScheduleExpression` 中指定了时间，但我的规则没有运行
<a name="eb-rule-did-not-trigger"></a>

确保您在 UTC\$10 时区为[规则](eb-rules.md)设置计划。如果 `ScheduleExpression` 正确，则按照[我刚刚创建或修改了规则，但它未能匹配测试事件](#eb-rule-does-not-match)中的步骤操作。

## 我的规则未在我期望的时间运行
<a name="eb-rule-did-not-trigger-on-time"></a>

EventBridge 在您设置的开始时间后的一分钟内运行[规则](eb-rules.md)。规则一旦创建，倒计时立即开始。

**注意**  
计划规则的传送类型为 `guaranteed`，这意味着事件将在每个预期时间至少触发一次。

您可以使用 cron 表达式在指定时间调用[目标](eb-targets.md)。要创建每四小时的第 0 分钟运行一次的规则，请执行以下操作之一：
+ 在 EventBridge 控制台中，您可以使用 cron 表达式`0 0/4 * * ? *`。
+ 使用 AWS CLI，您可以使用表达式`cron(0 0/4 * * ? *)`。

例如，要使用创建每隔 4 小时运行一次的名为`TestRule`的规则 AWS CLI，请使用以下命令。

```
aws events put-rule --name TestRule --schedule-expression 'cron(0 0/4 * * ? *)'
```

要每五分钟运行一次规则，请使用以下 cron 表达式。

```
aws events put-rule --name TestRule --schedule-expression 'cron(0/5 * * * ? *)'
```

使用 cron 表达式的 EventBridge 规则的最佳分辨率为一分钟。您的计划规则会在这一分钟内运行，但不会精确到第 0 秒。

由于 EventBridge 目标服务是分布式的，因此从计划规则运行到目标服务对目标资源执行操作之间可能会有几秒钟的延迟。

## 我的规则与 AWS 全局服务 API 调用相匹配，但它没有运行
<a name="eb-rule-did-not-trigger-iam"></a>

AWS 全球服务；例如 IAM 和 Amazon Route 53 仅在美国东部（弗吉尼亚北部）地区可用，因此来自全球服务的 AWS API 调用所产生的事件仅在该地区可用。有关更多信息，请参阅 [来自 AWS 服务的事件](eb-events.md#eb-service-event)。

## 规则运行时，与我的规则关联的 IAM 角色被忽略
<a name="eb-iam-role-ignored"></a>

EventBridge 仅将 IAM 角色用于向 Kinesis 直播发送[事件](eb-events.md)的[规则](eb-rules.md)。对于调用 Lambda 函数或 Amazon SNS 主题的规则，您需要提供[基于资源的权限](eb-use-resource-based.md)。

确保您的区域 AWS STS 终端节点已启用，以便在担任您提供的 IAM 角色时 EventBridge 可以使用这些终端节点。有关更多信息，请参阅 *IAM 用户指南 AWS STS *[中的在 AWS 区域中激活和停用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

## 我的规则的事件模式应该与某资源匹配，但未匹配事件
<a name="eb-events-do-not-match-rule"></a>

中的大多数服务都 AWS 将冒号 (:) 或斜杠 (/) 视为亚马逊资源名称 (ARNs) 中的相同字符。，但在[事件模式](eb-event-patterns.md)和[规则](eb-rules.md)中 EventBridge 使用完全匹配的字符。请务必在创建事件模式时使用正确的 ARN 字符，以使其与需要匹配的[事件](eb-events.md)中的 ARN 语法相匹配。

有些事件（例如来自 AWS CloudTrail的 API 调用事件）在资源字段中没有任何内容。

## 向目标传送我的事件时存在延迟
<a name="eb-delayed-event-delivery"></a>

EventBridge 尝试将[事件](eb-events.md)传送到[目标](eb-targets.md)最多 24 小时，但目标资源受限的情况除外。事件一旦到达事件流，立即会进行第一次尝试。如果目标服务出现问题，则 EventBridge自动重新安排其他交付。如果自事件到达以来已过去 24 小时，则 EventBridge 停止尝试交付事件并在中发布`FailedInvocations`指标 CloudWatch。我们建议您设置 DLQ，存储无法成功传送到目标的事件。有关更多信息，请参阅 [使用死信队列处理中未传送的事件 EventBridge](eb-rule-dlq.md)。

## 某些事件从未传送到我的目标
<a name="eb-never-delivered-to-target"></a>

如果 EventBridge [规则](eb-rules.md)的[目标](eb-targets.md)长时间受到限制，则 EventBridge 可能无法重试交付。例如，如果未配置目标来处理传入[的事件](eb-events.md)流量，而目标服务正在限制代表您发 EventBridge 出的请求，则 EventBridge 可能不会重试传送。

## 我的规则在回应一个事件时多次运行
<a name="eb-rule-triggered-more-than-once"></a>

在很少的情况下，同一[规则](eb-rules.md)可能会因一个[事件](eb-events.md)或计划时间多次运行，或同一[目标](eb-targets.md)可能会因特定的已触发规则而被多次调用。

## 防止无限循环
<a name="eb-prevent-infinite-loops"></a>

在中 EventBridge，可以创建一条导致无限循环的[规则](eb-rules.md)，在这种循环中，规则会重复运行。如果您有导致无限循环的规则，请重写，使该规则执行的操作不会与同一规则匹配。

例如，检测到 Amazon S3 存储桶上 ACLs 已更改的内容，然后运行软件将其更改为新状态的规则会导致无限循环。解决该问题的一种方法是重写规则，使其仅匹配 ACLs 处于不良状态的规则。

无限循环可能快速导致费用超出预期。我们建议您使用预算功能，以便在费用超出您指定的限制时提醒您。有关更多信息，请参阅[通过预算管理成本](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html)。

## 我的事件没有传送到目标 Amazon SQS 队列
<a name="eb-sqs-encrypted"></a>

如果您的 Amazon SQS 队列已加密，必须创建由客户管理的 KMS 密钥，并在您的 KMS 密钥政策中包含以下权限部分。有关更多信息，请参阅[配置 AWS KMS 权限](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html#sqs-what-permissions-for-sse)。

```
{
  "Sid": "Allow EventBridge to use the key",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*"
}
```

## 我的规则可以运行，但未看到任何消息发布到我的 Amazon SNS 主题
<a name="eb-no-messages-published-sns"></a>

**方案 1**

您需要获得许可，才能将消息发布到 Amazon SNS 主题中。使用以下命令 AWS CLI，将 us-east-1 替换为您所在的地区并使用您的主题 ARN。

```
aws sns get-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic"
```

要获得正确的权限，您的策略属性应类似于以下内容。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "__default_policy_ID",
    "Statement": [
    {
    "Sid": "__default_statement_ID",
    "Effect": "Allow",
    "Principal": {
    "AWS": "*"
    },
    "Action": [
    "SNS:Subscribe",
    "SNS:ListSubscriptionsByTopic",
    "SNS:DeleteTopic",
    "SNS:GetTopicAttributes",
    "SNS:Publish",
    "SNS:RemovePermission",
    "SNS:AddPermission",
    "SNS:SetTopicAttributes"
    ],
    "Resource": "arn:aws:sns:us-east-1:123456789012:MyTopic",
    "Condition": {
    "StringEquals": {
    "AWS:SourceOwner": "123456789012"
    }
    }
    },
    {
    "Sid": "Allow_Publish_Events",
    "Effect": "Allow",
    "Principal": {
    "Service": "events.amazonaws.com"
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:us-east-1:123456789012:MyTopic"
    }
    ]
    }
```

------

如果您在策略中看不到 `events.amazonaws.com` 具有 `Publish` 权限，请先复制当前策略，然后将以下语句添加到语句列表中。

```
{\"Sid\":\"Allow_Publish_Events\",
\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},
\"Action\":\"sns:Publish\",
\"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}
```

然后使用设置主题属性 AWS CLI，使用以下命令。

```
aws sns set-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic" --attribute-name Policy --attribute-value NEW_POLICY_STRING
```

**注意**  
如果策略不正确，您也可以在 EventBridge 控制台中编辑该[规则](eb-rules.md)，方法是将其删除，然后将其重新添加到规则中。 EventBridge 在[目标](eb-targets.md)上设置正确的权限。

**方案 2**

如果您的 SNS 主题已加密，您必须在 KMS 密钥政策中包含以下部分。

```
{
  "Sid": "Allow EventBridge to use the key",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*"
}
```

## EventBridge 即使我删除了与亚马逊 SNS 主题相关的规则，我的 Amazon SNS 主题仍然具有访问权限
<a name="eb-sns-permissions-persist"></a>

当您创建以亚马逊 SNS 为[目标](eb-targets.md)的[规则](eb-rules.md)时， EventBridge 会代表您向您的亚马逊 SNS 主题添加权限。如果您在创建规则后不久就将其删除，则 EventBridge 可能无法从您的 Amazon SNS 主题中删除该权限。如果发生此情况，您可以使用 `aws sns set-topic-attributes` 命令从该主题删除权限。有关用于发送事件的基于资源权限的信息，请参阅[为 Amazon 使用基于资源的政策 EventBridge](eb-use-resource-based.md)。

## 我可以将哪些 IAM 条件键与之搭配使用 EventBridge？
<a name="eb-supported-access-policies"></a>

EventBridge 支持 AWS范围内的条件键（请参阅 [IAM *用户指南中的 IAM* 和 AWS STS 条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html)）以及中列出的密钥。[在 Amazon 中使用 IAM 政策条件 EventBridge](eb-use-conditions.md)

## 我怎么知道什么时候 EventBridge 违反了规则？
<a name="eb-create-alarm-broken-event-rules"></a>

当您的 EventBridge [规则](eb-rules.md)被违反时，您可以使用以下警报来通知您。

**创建警报以在违反规则时发出通知**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 选择**创建警报**。在 “**按类别划分的CloudWatch 指标**” 窗格中，选择**事件指标**。

1. 在指标列表中，选择**FailedInvocations**。

1. 在图形上方，依次选择 **Statistic** 和 **Sum**。

1. 对于 **Period**，选择一个值，例如 **5 minutes**。选择**下一步**。

1. **例如，在 “**警报阈值**” 下的 “名称” 中，键入警报的唯一名称**myFailedRules**。**对于**描述**，键入警报的描述，例如 **Rules aren't delivering events to targets**。

1. 对于 **is**，依次选择 **>=** 和 **1**。对于 **for**，输入 **10**。

1. 在 **Actions（操作）**下，为 **Whenever this alarm（每当此告警）**选择 **State is ALARM（状态为“告警”）**。

1. 对于 **Send notification to**，选择一个现有 Amazon SNS 主题或创建一个新 SNS 主题。要创建新主题，请选择**新建列表**。为新的 Amazon SNS 主题键入一个名称，例如：。**myFailedRules**

1. 对于 **Email list**，请键入警报变为 **ALARM** 状态时将通知发送到的电子邮件地址列表 (以逗号分隔)。

1. 选择**创建警报**。