

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

# Amazon EventBridge 事件模式的最佳实践
<a name="eb-patterns-best-practices"></a>

以下是在事件总线规则中定义事件模式时需要考虑的一些最佳实践。

## 避免编写无限循环
<a name="eb-patterns-best-practices-loops"></a>

在中 EventBridge，可以创建导致无限循环的规则，即重复触发规则。例如，规则可能会检测到 S3 存储桶上 ACLs 已更改的内容，并触发软件将其更改为所需状态。如果不仔细编写规则，则随后对规则的更改会再次 ACLs 触发该规则，从而形成无限循环。

为了防止出现这些问题，请为规则编写尽可能精确的事件模式，这样它们就只会匹配您实际希望发送到目标的事件。在上面的示例中，您将创建一个事件模式来匹配事件，使触发的操作就不会重新触发相同的规则。例如，在规则中创建一个事件模式，该模式仅在发现事件 ACLs 处于不良状态时才匹配事件，而不是在进行任何更改后才会匹配。有关更多信息，请参阅[使事件模式尽可能精确](#eb-patterns-best-practices-precision)和[确定事件模式的范围，将事件源更新纳入考虑范围](#eb-patterns-best-practices-future-proof)。

无限循环可能快速导致费用超出预期。它还可能导致节流和事件传送延迟。您可以监控调用速率的上限，在数量出现意外激增时收到警告。

使用预算，在费用超出指定限额时提醒您。有关更多信息，请参阅[通过预算管理成本](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html)。

## 使事件模式尽可能精确
<a name="eb-patterns-best-practices-precision"></a>

您的事件模式越精确，就越有可能只匹配您真正想要匹配的事件，并且在向事件源添加新事件，或更新现有事件以包含新属性时，避免意外匹配。

事件模式可以包括筛选器，匹配以下内容：
+ 有关该事件的事件元数据，例如 `source`、`detail-type`、`account` 或`region`。
+ 事件数据，即 `detail` 对象内的字段。
+ 事件内容，或 `detail` 对象内字段的实际值。

大多数模式都很简单，例如仅指定 `source` 和 `detail-type` 筛选器。但是， EventBridge 模式包括可以灵活地根据事件的任何键或值进行筛选。此外，您可以应用内容筛选器（例如 `prefix` 和 `suffix` 筛选器）来提高模式的精度。有关更多信息，请参阅 [在 Amazon EventBridge 事件模式中使用比较运算符](eb-create-pattern.md#eb-event-patterns-content-based-filtering)。

### 将事件源和详细信息类型指定为筛选器
<a name="eb-patterns-best-practices-source"></a>

使用 `source` 和 `detail-type` 元数据字段使事件模式更加精确，可以减少生成无限循环和匹配不想要的事件的概率。

如果需要匹配两个或更多字段中的特定值，请使用 `$or` 比较运算符，而不是在单个值数组中列出所有可能的值。

对于通过传送的事件 Amazon CloudTrail，我们建议您使用该`eventName`字段作为筛选条件。

以下事件模式示例匹配`CreateQueue`或`SetQueueAttributes`来自 Amazon 简单队列服务`CreateKey`或来自该 Amazon Key Management Service 服务`DisableKeyRotation`的事件。

```
{
  "detail-type": ["AWS API Call via CloudTrail"],
  "$or": [{
      "source": [
        "aws.sqs"
        ],
      "detail": {
        "eventName": [
          "CreateQueue",
          "SetQueueAttributes"
        ]
      }
    },
    {
      "source": [
        "aws.kms"
        ],
      "detail": {
        "eventName": [
          "CreateKey",
          "DisableKeyRotation"
        ]
      }
    }
  ]
}
```

### 指定账户和区域作为筛选条件
<a name="eb-patterns-best-practices-accounts-regions"></a>

在事件模式中包含 `account` 和 `region` 字段，有助于限制跨账户或跨区域的事件匹配。

### 指定内容筛选器
<a name="eb-patterns-best-practices-content"></a>

基于内容的筛选有助于提高事件模式的精度，同时仍将事件模式的长度保持最短。例如，与列出所有可能的数值相比，基于数值范围进行匹配可能更加合适。

有关更多信息，请参阅 [在 Amazon EventBridge 事件模式中使用比较运算符](eb-create-pattern.md#eb-event-patterns-content-based-filtering)。

## 确定事件模式的范围，将事件源更新纳入考虑范围
<a name="eb-patterns-best-practices-future-proof"></a>

创建事件模式时，应考虑到事件架构和事件域可能会随着时间的推移而演变和扩展。再次重申，尽可能精确地设置事件模式，可以帮助您在事件源发生变化或扩展时限制意外匹配。

例如，假设您要与来自新的微服务的事件进行匹配，该服务发布与支付相关的事件。最初，该服务使用域 `acme.payments`，并发布单个事件 `Payment accepted`：

```
{
  "detail-type": "Payment accepted",
  "source": "acme.payments",
  "detail": {
    "type": "credit",
    "amount": "100",
    "date": "2023-06-10",
    "currency": "USD"
    }
  }
}
```

此时，您可以创建与已接受付款的事件相匹配的简单事件模式：

```
{ “source” : “acme.payments” }
```

但是，假设该服务稍后引入了一个针对拒绝付款的新事件：

```
{
  "detail-type": "Payment rejected",
  "source": "acme.payments",
  "detail": {
  }
}
```

在这种情况下，您创建的简单事件模式现在将与`Payment accepted`和`Payment rejected`事件匹配。 EventBridge 将两种类型的事件路由到指定的目标进行处理，这可能会导致处理失败和额外的处理成本。

要将事件模式的范围仅限定于 `Payment accepted` 事件，您需要至少同时指定 `source` 和 `detail-type`：

```
{
  "detail-type": "Payment accepted",
  "source": "acme.payments"
  }
}
```

您还可以在事件模式中指定账户和区域，进一步限制跨账户或跨区域事件何时匹配此规则。

```
{
  "account": "012345678910",
  "source": "acme.payments",
  "region": "Amazon-Region",
  "detail-type": "Payment accepted"
}
```

## 验证事件模式
<a name="eb-patterns-best-practices-validate"></a>

为确保规则与所需事件相匹配，我们强烈建议您验证您的事件模式。您可以使用 EventBridge 控制台或 API 验证您的事件模式：
+ 在 EventBridge 控制台中，您可以在创建[规则的过程中创建和测试事件模式，也可以[使用沙盒](eb-event-pattern-sandbox.md)单独创建](eb-create-rule-visual.md)和测试事件模式。
+ 您可以使用[test-event-pattern](https://docs.amazonaws.cn/cli/latest/reference/events/test-event-pattern.html)命令在中 Amazon CLI 测试您的事件模式。