

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

# 创建 Amazon EventBridge 事件模式
创建事件模式

您可能不想处理传送到给定事件总线或管道的每一个事件。相反，您可能需要根据事件的来源、事件类型和这些事件的 and/or 属性来选择所有已交付事件的子集。

要指定向目标发送哪些事件，请创建*事件模式*。事件模式定义了用于确定是否将事件发送到目标的数据 EventBridge 。如果事件模式与事件匹配，则将事件 EventBridge 发送到目标。事件模式与它们匹配的事件具有相同的结构。事件模式匹配或不匹配事件。

**提示**  
在创建或更新规则之前，您可以使用 EventBridge 沙盒根据示例事件测试事件模式。有关更多信息，请参阅 [使用 EventBridge 沙盒测试事件模式](eb-event-pattern-sandbox.md)。

例如，考虑以下来自 Amazon 的事件 EC2：

```
{
  "version": "0",
  "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "111122223333",
  "time": "2017-12-22T18:43:48Z",
  "region": "us-west-1",
  "resources": [
    "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"
  ],
  "detail": {
    "instance-id": "i-1234567890abcdef0",
    "state": "terminated"
  }
}
```

以下事件模式选择所有 Amazon EC2 `instance-termination` 事件。事件模式通过指定用于匹配事件的三个要求来实现此目的：

1. 事件源必须是 Amazon EC2。

1. 该事件必须是 Amazon EC2 状态变更通知。

1. Amazon EC2 实例的状态必须为`terminated`。

```
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["terminated"]
  }
}
```

请注意，在此示例中，事件模式包括与事件*相关的*字段（`source` 和 `detail-type`）以及事件正文中的一个字段 (`state`)。

**重要**  
在中 EventBridge，可以创建可能导致 higher-than-expected收费和限制的规则。例如，您可能无意中创建了一条规则，导致无限循环，规则会以递归方式触发，不会结束。假设您创建了一条规则来检测 Amazon S3 存储桶上 ACLs 已更改的内容，并触发软件将其更改为所需状态。如果不仔细编写规则，则随后对规则的更改会再次 ACLs 触发该规则，从而形成无限循环。  
有关如何编写精确的规则和事件模式，以最大限度地减少此类意外结果的指导，请参阅[关于规则的最佳实践](eb-rules-best-practices.md)和[最佳实践](eb-patterns-best-practices.md)。

## 事件总线的事件模式
事件总线的事件模式

对于事件总线，您可以针对为总线创建的每条规则指定一个事件模式。通过这种方式，您可以选择向特定目标发送哪些事件。事件总线的事件模式可以与事件源、事件元数据、 and/or 事件详细信息值相匹配。

![\[将事件与每条总线规则的事件模式进行比较，如果匹配，则将其发送到目标。\]](http://docs.amazonaws.cn/eventbridge/latest/userguide/images/event-pattern-bus_eventbridge_architecture.svg)


## Pipes 的事件 EventBridge 模式
管道的事件模式

对于 EventBridge Pipes，您可以指定事件模式来筛选要传送到管道目标的管道源中的事件。由于每个管道都有一个事件源，因此管道的事件模式可以与事件元数据 and/or 详细信息值相匹配。

![\[将事件与管道的事件模式进行比较，如果匹配，则将其发送到目标。\]](http://docs.amazonaws.cn/eventbridge/latest/userguide/images/event-pattern-pipes_eventbridge_architecture.svg)


并非所有事件字段都可用于构造管道事件模式。有关更多信息，请参阅 [筛选](eb-pipes-event-filtering.md)。

# 事件模式语法
事件模式语法

要创建事件模式，您要指定希望事件模式匹配的事件字段。仅指定用于匹配的字段。

例如，以下事件模式示例仅提供三个字段的值：顶级字段`"source"`和`"detail-type"`，以及`"detail"`对象`"state"`字段内的字段。 EventBridge应用规则时会忽略事件中的所有其他字段。

```
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["terminated"]
  }
}
```

要使事件模式匹配事件，事件必须包含模式中列出的所有字段名。字段名必须还显示在具有相同嵌套结构的事件中。

在编写事件模式来匹配事件时，您可以使用 `TestEventPattern` API 或 `test-event-pattern` CLI 命令测试模式是否匹配正确的事件。有关更多信息，请参阅 [TestEventPattern](https://docs.amazonaws.cn/AmazonCloudWatchEvents/latest/APIReference/API_TestEventPattern.html)。

## 匹配事件值


在事件模式中，要匹配的值在 JSON 数组中，用方括号（“[”、“]”）括起，因此您可以提供多个值。例如，要匹配来自 Amazon EC2 或的事件 Amazon Fargate，您可以使用以下模式，该模式匹配`"source"`字段值为`"aws.ec2"`或的事件`"aws.fargate"`。

```
{
    "source": ["aws.ec2", "aws.fargate"]
}
```

有关更多信息，请参阅 [与多个字段值进行匹配](eb-event-patterns-arrays.md)。

## 在 Amazon EventBridge 事件模式中使用比较运算符
事件模式中基于内容的筛选

Amazon EventBridge 支持使用事件模式进行声明式内容筛选。通过内容筛选，您可以编写仅在非常具体的条件下匹配事件的复杂事件模式。例如，您可以创建事件模式，在以下情况下与事件匹配：
+ 事件的某个字段在特定的数值范围内。
+ 事件来自特定 IP 地址。
+ 事件 JSON 中不存在特定字段。

有关更多信息，请参阅 [比较运算符](eb-create-pattern-operators.md)。

## 创建事件模式时的注意事项


构造事件模式时需要考虑以下事项：
+ EventBridge 忽略事件中未包含在事件模式中的字段。结果是，事件模式中没有出现的字段用 `"*": "*"` 通配符表示。
+ 事件模式匹配的值遵循 JSON 规则。可以包括用引号（"）括起来的字符串、数字和关键字 `true`、`false` 和 `null`。
+ 对于字符串， EventBridge 使用精确 character-by-character匹配而不进行大小写折叠或任何其他字符串规范化。
+ 对于数字， EventBridge 使用字符串表示形式。例如，300、300.0 和 3.0e2 不相等。
+ 如果为同一 JSON 字段指定了多个模式，则 EventBridge 只使用最后一个模式。
+ 请注意，在 EventBridge 编译事件模式以供使用时，它使用点 (.) 作为连接字符。

  这意味着 EventBridge 将以下事件模式视为相同：

  ```
  ## has no dots in keys
  { "detail" : { "state": { "status": [ "running" ] } } }
  
  ## has dots in keys
  { "detail" : { "state.status": [ "running" ] } }
  ```

  这两个事件模式都将匹配以下两个事件：

  ```
  ## has no dots in keys
  { "detail" : { "state": { "status": "running" } } }
  
  ## has dots in keys
  { "detail" : { "state.status": "running"  } }
  ```
**注意**  
这描述了当前的 EventBridge 行为，不应依赖它来保持不变。
+ 包含重复字段的事件模式无效。如果模式包含重复字段，则 EventBridge 仅考虑最终字段值。

  例如，以下事件模式将匹配同一个事件：

  ```
  ## has duplicate keys
  {
    "source": ["aws.s3"],
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail":  {
        "eventSource": ["s3.amazonaws.com"],
        "eventSource": ["sns.amazonaws.com"]
    }
  }
  
  ## has unique keys
  {
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": { "eventSource": ["sns.amazonaws.com"] }
  }
  ```

  并将 EventBridge 以下两个事件视为相同：

  ```
  ## has duplicate keys
  {
    "source": ["aws.s3"],
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail":  [
      {
        "eventSource": ["s3.amazonaws.com"],
        "eventSource": ["sns.amazonaws.com"]
      }
    ]
  }
  
  ## has unique keys
  {
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": [
      { "eventSource": ["sns.amazonaws.com"] }
    ]
  }
  ```
**注意**  
这描述了当前的 EventBridge 行为，不应依赖它来保持不变。

# 根据事件字段值匹配事件
根据字段值进行匹配

您可以使用所有 JSON 数据类型和值来匹配事件。以下示例展示事件和与之匹配的事件模式。

## 字段匹配


您可以匹配字段的值。以下 Amazon A EC2 uto Scaling 事件为例。

```
{
  "version": "0",
  "id": "3e3c153a-8339-4e30-8c35-687ebef853fe",
  "detail-type": "EC2 Instance Launch Successful",
  "source": "aws.autoscaling",
  "account": "123456789012",
  "time": "2015-11-11T21:31:47Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "",
    "responseElements": null
  }
}
```

对于以上事件，您可以使用 `"responseElements"` 字段进行匹配。

```
{
  "source": ["aws.autoscaling"],
  "detail-type": ["EC2 Instance Launch Successful"],
  "detail": {
   "responseElements": [null]
  }
}
```

## 值匹配


请考虑以下 Amazon Macie 事件，该事件已被截断。

```
{
  "version": "0",
  "id": "0948ba87-d3b8-c6d4-f2da-732a1example",
  "detail-type": "Macie Finding",
  "source": "aws.macie",
  "account": "123456789012",
  "time": "2021-04-29T23:12:15Z",
  "region":"us-east-1",
  "resources": [

  ],
  "detail": {
    "schemaVersion": "1.0",
    "id": "64b917aa-3843-014c-91d8-937ffexample",
    "accountId": "123456789012",
    "partition": "aws",
    "region": "us-east-1",
    "type": "Policy:IAMUser/S3BucketEncryptionDisabled",
    "title": "Encryption is disabled for the S3 bucket",
    "description": "Encryption is disabled for the Amazon S3 bucket. The data in the bucket isn’t encrypted 
        using server-side encryption.",
    "severity": {
        "score": 1,
        "description": "Low"
    },
    "createdAt": "2021-04-29T15:46:02Z",
    "updatedAt": "2021-04-29T23:12:15Z",
    "count": 2,
.
.
.
```

以下事件模式匹配严重性分数为 1 且计数为 2 的任何事件。

```
{
  "source": ["aws.macie"],
  "detail-type": ["Macie Finding"],
  "detail": {
    "severity": {
      "score": [1]
    },
    "count":[2]
  }
}
```

# 在 Amazon 中匹配空值和空字符串的事件 EventBridge
匹配 Null 值和空字符串。

**重要**  
在中 EventBridge，可以创建可能导致 higher-than-expected收费和限制的规则。例如，您可能无意中创建了一条规则，导致无限循环，规则会以递归方式触发，不会结束。假设您创建了一条规则来检测 Amazon S3 存储桶上 ACLs 已更改的内容，并触发软件将其更改为所需状态。如果不仔细编写规则，则随后对规则的更改会再次 ACLs 触发该规则，从而形成无限循环。  
有关如何编写精确的规则和事件模式，以最大限度地减少此类意外结果的指导，请参阅[关于规则的最佳实践](eb-rules-best-practices.md)和[最佳实践](eb-patterns-best-practices.md)。

您可以创建一种[事件模式](eb-event-patterns.md)，与[事件](eb-events.md)中具有 Null 值或空字符串的字段匹配。考虑以下示例 事件。

查看最佳实践，以避免超出预期的费用和节流

```
{
  "version": "0",
  "id": "3e3c153a-8339-4e30-8c35-687ebef853fe",
  "detail-type": "EC2 Instance Launch Successful",
  "source": "aws.autoscaling",
  "account": "123456789012",
  "time": "2015-11-11T21:31:47Z",
  "region": "us-east-1",
  "resources": [
   ],
  "detail": {
    "eventVersion": "",
    "responseElements": null
   }
}
```

要匹配 `eventVersion` 值为空字符串的事件，请使用以下事件模式，它可匹配上一事件。

```
{
  "detail": {
     "eventVersion": [""]
  }
}
```

要匹配 `responseElements` 值为 Null 的事件，请使用以下事件模式，它可匹配上一事件。

```
{
  "detail": {
     "responseElements": [null]
  }
}
```

**注意**  
在模式匹配中，Null 值和空字符串是不可互换的。匹配空字符串的事件模式不匹配 `null` 值。

## 在 Amazon CloudFormation 模板中使用空值


Amazon CloudFormation 不允许在模板中使用`null`值。如果您使用 YAML 或 JSON 对象语法定义了具有空值的事件模式，则模板验证失败并显示错误：`'null' values are not allowed in templates`。

要解决此限制，请将该`EventPattern`属性指定为 JSON 字符串，而不是 YAML 或 JSON 对象。以下示例说明如何匹配 Amazon CloudFormation 模板中的空值：

```
MyRule:
  Type: AWS::Events::Rule
  Properties:
    EventPattern: '{"detail":{"responseElements":[null]}}'
```

# 在 Amazon EventBridge 中匹配事件字段的多个值
与多个字段值进行匹配

[事件模式](eb-event-patterns.md)中每个字段的值都是包含一个或多个值的数组。如果数组中的任何值与[事件](eb-events.md)中的值相匹配，则事件模式与该事件匹配。如果事件中的值为数组，则在事件模式数组与事件数组的交集不为空时，事件模式匹配。

**重要**  
在 EventBridge 中，创建的规则可能导致高于预期的费用和节流。例如，您可能无意中创建了一条规则，导致无限循环，规则会以递归方式触发，不会结束。假设您创建了一条规则，来检测 S3 桶中的 ACL 更改，然后触发软件以将 ACL 更改为所需状态。如果编写该规则时不小心，则 ACL 的后续更改将再次触发该规则，从而产生无限循环。  
有关如何编写精确的规则和事件模式，以最大限度地减少此类意外结果的指导，请参阅[关于规则的最佳实践](eb-rules-best-practices.md)和[最佳实践](eb-patterns-best-practices.md)。

例如，考虑包含以下字段的事件模式。

```
"resources": [
   "arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f",
   "arn:aws:ec2:us-east-1:111122223333:instance/i-b188560f",
   "arn:aws:ec2:us-east-1:444455556666:instance/i-b188560f",
]
```

上一事件模式与包括以下字段的事件相匹配，因为事件模式数组中的第一项与事件数组中的第二项匹配。

```
"resources": [
   "arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:eb56d16b-bbf0-401d-b893-d5978ed4a025:autoScalingGroupName/ASGTerminate",
   "arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f" 
]
```

# 用于亚马逊事件模式的比较运算符 EventBridge
比较运算符

以下是中所有可用的比较运算符的摘要 EventBridge。

比较运算符仅适用于叶节点，`$or` 和 `anything-but` 除外。


| **Comparison**（比较） | **示例** | **Rule syntax**（规则语法） | **事件总线支持** | **管道支持** | 
| --- | --- | --- | --- | --- | 
|  And  |  位置为“纽约”，日期为“星期一”  |  `"Location": [ "New York" ], "Day": ["Monday"]`  |  支持  |  是  | 
| [Anything-but](#eb-filtering-anything-but) | 状态是除了“initializing”之外的任何值。 | `"state": [ { "anything-but": "initializing" } ]` |  支持  |  是  | 
| [Anything-but (begins with)](#eb-filtering-anything-but-prefix) | 区域不在美国。 |  `"Region": [ { "anything-but": {"prefix": "us-" } } ]`  |  是  |  否  | 
| [Anything-but (ends with)](#eb-filtering-anything-but-suffix) | FileName 不以.png 扩展名结尾。 |  `"FileName": [ { "anything-but": { "suffix": ".png" } } ]`  |  是  |  否  | 
| [Anything-but (ignore case)](#eb-filtering-anything-but-ignore-case) | 状态是除了“initializing”或任何其他大小写变体（例如“INITIALIZING”）之外的任何值。 | `"state": : [{ "anything-but": { "equals-ignore-case": "initializing" }}]}` |  是  |  否  | 
| [Anything-but using a wildcard](#eb-filtering-anything-but-wildcard) | FileName 不是包含以下内容的文件路径`/lib/`。 |  `"FilePath" : [{ "anything-but": { "wildcard": "*/lib/*" }}]`  |  是  |  否  | 
|  [开头](#eb-filtering-prefix-matching)  |  区域位于美国。  |  `"Region": [ {"prefix": "us-" } ]`  |  支持  |  是  | 
| Begins with (ignore case) | 服务名称以字母“eventb”开头（不区分大小写）。 | `{"service" : [{ "prefix": { "equals-ignore-case": "eventb" }}]}` |  支持  |  是  | 
|  [空](eb-event-patterns-null-values.md)  |  LastName 为空。  |  `"LastName": [""]`  |  支持  |  是  | 
|  Equals  |  名字为“Alice”  |  `"Name": [ "Alice" ]`  |  支持  |  是  | 
|  [等于（忽略大小写）](#eb-filtering-equals-ignore-case-matching)  |  名字为“Alice”  |  `"Name": [ { "equals-ignore-case": "alice" } ]`  |  支持  |  是  | 
|  [结束](#eb-filtering-suffix-matching)  |  FileName 以.png 扩展名结尾  |  `"FileName": [ { "suffix": ".png" } ]`  |  支持  |  是  | 
| Ends with (ignore case) | 服务名称以字母“tbridge”或任何其他大小写变体（例如“TBRIDGE”）结尾。 | `{"service" : [{ "suffix": { "equals-ignore-case": "tBridge" }}]}` |  支持  |  是  | 
|  [存在](#eb-filtering-exists-matching)  |  ProductName 存在  |  `"ProductName": [ { "exists": true } ]`  |  支持  |  是  | 
|  [不存在](#eb-filtering-exists-matching)  |  ProductName 不存在  |  `"ProductName": [ { "exists": false } ]`  |  支持  |  是  | 
|  [非](#eb-filtering-anything-but)  |  天气是除“下雨”以外的任何天气  |  `"Weather": [ { "anything-but": [ "Raining" ] } ]`  |  支持  |  是  | 
|  [Null](eb-event-patterns-null-values.md)  |  用户 ID 为空  |  `"UserID": [ null ]`  |  支持  |  是  | 
|  [数值（等于）](#filtering-numeric-matching)  |  价格为 100  |  `"Price": [ { "numeric": [ "=", 100 ] } ]`  |  支持  |  是  | 
|  [数值（范围）](#filtering-numeric-matching)  |  价格大于 10，且小于等于 20  |  `"Price": [ { "numeric": [ ">", 10, "<=", 20 ] } ]`  |  支持  |  是  | 
|  Or  |  PaymentType 是 “贷方” 或 “借记卡”  |  `"PaymentType": [ "Credit", "Debit"]`  |  支持  |  是  | 
|  [或（多个字段）](#eb-filtering-complex-example-or)  |  位置为“纽约”，或日期为“星期一”。  |  `"$or": [ { "Location": [ "New York" ] }, { "Day": [ "Monday" ] } ]`  |  支持  |  是  | 
|  [通配符](#eb-filtering-wildcard-matching)  |  位于“dir”文件夹中的任何扩展名为 .png 的文件  |  `"FileName": [ { "wildcard": "dir/*.png" } ] `  |  是  |  否  | 

## 前缀匹配
前缀匹配

您可以根据事件源中值的前缀匹配事件。您可以对字符串值使用 prefix 匹配。

例如，以下事件模式将匹配 `"time"` 字段以 `"2017-10-02"` 开头的任何事件，例如 `"time": "2017-10-02T18:43:48Z"`。

```
{
  "time": [ { "prefix": "2017-10-02" } ]
}
```

### Prefix 匹配（忽略大小写）


您也可以将 `equals-ignore-case` 与 `prefix.` 搭配使用，在匹配前缀值时，不考虑值开头字符的大小写。

例如，以下事件模式将匹配其中 `service` 字段以 `EventB`、`EVENTB`、`eventb` 或这些字符的任何其他大写开头的任何事件。

```
{
  "detail": {"service" : [{ "prefix": { "equals-ignore-case": "EventB" }}]}
}
```

## 后缀匹配
后缀匹配

您可以根据事件源中值的后缀匹配事件。您可以对字符串值使用后缀匹配。

例如，以下事件模式将匹配 `"FileName"` 字段以 `.png` 文件扩展名结尾的任何事件。

```
{
  "FileName": [ { "suffix": ".png" } ]
}
```

### Suffix 匹配（忽略大小写）


您也可以将 `equals-ignore-case` 与 `suffix.` 搭配使用，在匹配后缀值时，不考虑值开头字符的大小写。

例如，以下事件模式将匹配其中 `FileName` 字段以 `.png`、`.PNG` 或这些字符的任何其他大写结尾的任何事件。

```
{
  "detail": {"FileName" : [{ "suffix": { "equals-ignore-case": ".png" }}]}
}
```

## Anything-but 匹配
Anything-but 匹配

*Anything-but* 匹配会匹配除规则中指定的内容之外的任何内容。

您可以将 Anything-but 匹配与字符串和数值一起使用，包括仅包含字符串或仅包含数值的列表。

以下事件模式显示了 Anything-but 匹配与字符串和数字。

```
{
  "detail": {
    "state": [ { "anything-but": "initializing" } ]
  }
}

{
  "detail": {
    "x-limit": [ { "anything-but": 123 } ]
  }
}
```

以下事件模式显示了 Anything-but 匹配与一组字符串。

```
{
  "detail": {
    "state": [ { "anything-but": [ "stopped", "overloaded" ] } ]
  }
}
```

以下事件模式显示了 Anything-but 匹配与一组数字。

```
{
  "detail": {
    "x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
  }
}
```

### Anything-but 匹配（忽略大小写）


您也可以将 `equals-ignore-case` 与 `anything-but` 搭配使用，匹配字符串值，不考虑字符大小写。

以下事件模式将匹配不包含字符串“initializing”、“INITIALIZING”、“Initializing”或这些字符的任何其他大写字母的 `state` 字段。

```
{
  "detail": {"state" : [{ "anything-but": { "equals-ignore-case": "initializing" }}]}
}
```

您也可以将 `equals-ignore-case` 与 `anything-but` 搭配使用匹配值列表：

```
{
  "detail": {"state" : [{ "anything-but": { "equals-ignore-case": ["initializing", "stopped"] }}]}
}
```

### 对前缀使用 anything-but 匹配


您可以将 `prefix` 与 `anything-but` 搭配使用来匹配不以指定值开头的字符串值。这包括单个的值或值的列表。

以下事件模式显示了与 `"state"` 字段中没有 `"init"` 前缀的任何事件相匹配的 anything-but 匹配。

```
{
  "detail": {
    "state": [ { "anything-but": { "prefix": "init" } } ]
  }
}
```

以下事件模式显示了与一个前缀值列表搭配使用的 anything-but 匹配。此事件模式将匹配 `"state"` 字段中没有前缀 `"init"` 或 `"stop"` 的任何事件。

```
{
"detail": {
  "state" : [{ "anything-but": { "prefix": ["init", "stop"] } } ] }
  }
}
```

### 对后缀使用 anything-but 匹配


您可以将 `suffix` 与 `anything-but` 搭配使用来匹配不以指定值结尾的字符串值。这包括单个的值或值的列表。

以下事件模式将匹配 `FileName` 字段中不以 `.txt` 结尾的任何值。

```
{
  "detail": {
    "FileName": [ { "anything-but": { "suffix": ".txt" } } ]
  }
}
```

以下事件模式显示了与一个后缀值列表搭配使用的 anything-but 匹配。此事件模式将匹配 `FileName` 字段中不以 `.txt` 或 `.rtf` 结尾的任何值。

```
{
  "detail": {
    "FileName": [ { "anything-but": { "suffix": [".txt", ".rtf"] } } ]
  }
}
```

### Anything-but 匹配与通配符搭配使用


您可以在为 anything-but 匹配指定的值中使用通配符（\$1）。这包括单个的值或值的列表。

以下事件模式将匹配 `FileName` 字段中不包含 `/lib/` 的任何值。

```
{
"detail": {
  "FilePath" : [{ "anything-but": { "wildcard": "*/lib/*" }}]
  }
}
```

以下事件模式显示了与一个含通配符的值列表搭配使用的 anything-but 匹配。此事件模式将匹配 `FileName` 字段中不含 `/lib/` 或 `/bin/` 的任何值。

```
{
"detail": {
  "FilePath" : [{ "anything-but": { "wildcard": ["*/lib/*", "*/bin/*"] }}]
  }
}
```

有关更多信息，请参阅 [使用通配符进行匹配](#eb-filtering-wildcard-matching)。

## 数值匹配
数值匹配

数值匹配适用于 JSON 数字值。仅限于 -5.0e9 和 \$15.0e9（含）之间的值，精度为 15 位（小数点右侧为六位）。

以下代码显示的事件模式的数值匹配，仅匹配所有字段均为真的事件。

```
{
  "detail": {
    "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
    "d-count": [ { "numeric": [ "<", 10 ] } ],
    "x-limit": [ { "numeric": [ "=", 3.018e2 ] } ]
  }
}
```

## IP 地址匹配
IP 地址匹配

您可以对 IPv4 和地址使用 IP IPv6 地址匹配。以下事件模式显示的 IP 地址匹配，匹配以 10.0.0 开头并以 0 到 255 之间的数字结尾的 IP 地址。

```
{
  "detail": {
    "sourceIPAddress": [ { "cidr": "10.0.0.0/24" } ]
  }
}
```

## Exists 匹配
Exists 匹配

*Exists 匹配* 用于确定事件的 JSON 中存在或不存在某个字段。

Exists 匹配仅适用于叶节点。它对于中间节点不起作用。

以下事件模式与任何具有 `detail.state` 字段的事件相匹配。

```
{
  "detail": {
    "state": [ { "exists": true  } ]
  }
}
```

上一事件模式与以下事件匹配。

```
{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "123456789012",
  "time": "2015-11-11T21:29:54Z",
  "region": "us-east-1",
  "resources": ["arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"],
  "detail": {
    "instance-id": "i-abcd1111",
    "state": "pending"
  }
}
```

上一事件模式与以下事件不匹配，因为它没有 `detail.state` 字段。

```
{
  "detail-type": [ "EC2 Instance State-change Notification" ],
  "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
  "detail": {
    "c-count" : {
       "c1" : 100
    }
  }
}
```

## Equals-ignore-case 匹配
Equals-ignore-case 匹配

无论大小写如何，*E quals-ignore-case* 匹配都适用于字符串值。

以下事件模式匹配 `detail-type` 字段与指定字符串相匹配（无论大小写如何）的任何事件。

```
{
  "detail-type": [ { "equals-ignore-case": "ec2 instance state-change notification" } ]
}
```

上一事件模式与以下事件匹配。

```
{
  "detail-type": [ "EC2 Instance State-change Notification" ],
  "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
  "detail": {
    "c-count" : {
       "c1" : 100
    }
  }
}
```

## 使用通配符进行匹配
通配符匹配

您可以使用通配符 (\$1) 匹配事件模式中的字符串值。

**注意**  
目前，只有事件总线规则支持通配符。

在事件模式中使用通配符的注意事项：
+ 可以在给定的字符串值中指定任意数量的通配符；但是，不支持连续通配符。
+ EventBridge 支持使用反斜杠字符 (\$1) 来指定通配符过滤器中的文字 \$1 和\$1 字符：
  + 字符串 `\*` 代表文字 \$1 字符
  + 字符串 `\\` 代表文字 \$1 字符

  不支持使用反斜杠对其他字符进行转义。

### 通配符和事件模式的复杂性


规则使用通配符的复杂程度是有限的。如果规则过于复杂，则`InvalidEventPatternException`在尝试创建规则时 EventBridge 返回。如果您的规则生成此类错误，请考虑使用以下指南来降低事件模式的复杂性：
+ **减少使用的通配符数量**

  仅在确实需要匹配多个可能值的位置使用通配符。例如，考虑以下事件模式，您想匹配同一区域中的事件总线：

  ```
  {
  "EventBusArn": [ { "wildcard": "*:*:*:*:*:event-bus/*" } ]
  }
  ```

  在上述情况下，ARN 的许多部分将直接取决于您的事件总线所在的区域。因此，如果您使用 `us-east-1` 区域，则以下示例可能是不太复杂，但仍可与所需值匹配的模式：

  ```
  {
  "EventBusArn": [ { "wildcard": "arn:aws:events:us-east-1:*:event-bus/*" } ]
  }
  ```
+ **减少通配符后出现的重复字符序列**

  使用通配符后多次出现相同的字符序列，会增加处理事件模式的复杂性。请修改您的事件模式，最大限度地减少重复序列。例如，考虑以下示例，该示例与任何用户的文件名为 `doc.txt` 的文件相匹配：

  ```
  {
  "FileName": [ { "wildcard": "/Users/*/dir/dir/dir/dir/dir/doc.txt" } ]
  }
  ```

  如果您知道 `doc.txt` 文件只会出现在指定路径中，则可以通过以下方式减少重复的字符序列：

  ```
  {
  "FileName": [ { "wildcard": "/Users/*/doc.txt" } ]
  }
  ```

## 具有多个匹配的复杂示例
复杂的多匹配

您可以将多匹配条件组合成更复杂的事件模式。例如，以下事件模式组合了 `anything-but` 和 `numeric`。

```
{
  "time": [ { "prefix": "2017-10-02" } ],
  "detail": {
    "state": [ { "anything-but": "initializing" } ],
    "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
    "d-count": [ { "numeric": [ "<", 10 ] } ],
    "x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
  }
}
```

**注意**  
在构建事件模式时，如果您多次包含一个密钥，则最后一次引用将用于评估事件。例如，对于以下模式：  

```
{
  "detail": {
    "location": [ { "prefix": "us-" } ],
    "location": [ { "anything-but": "us-east" } ]
  }
}
```
只有在评估 `location` 时才会考虑 `{ "anything-but": "us-east" }`。

## 具有 `$or` 匹配的复杂示例
复杂的 `$or` 匹配

您还可以创建复杂的事件模式，检查多个字段中是否有*任何* 字段值匹配。`$or` 用于创建事件模式，匹配多个字段中有任何值匹配的情况。

请注意，在 `$or` 构造中，您可以在各个字段的模式匹配中包含其他筛选器类型，例如[数值匹配](#filtering-numeric-matching)和[数组](eb-event-patterns-arrays.md)。

满足以下任意条件时，匹配以下事件模式：
+ `c-count` 字段大于 0 或小于等于 5。
+ `d-count` 字段小于 10。
+ `x-limit` 字段等于 3.018e2。

```
{
  "detail": {
    "$or": [
      { "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ] },
      { "d-count": [ { "numeric": [ "<", 10 ] } ] },
      { "x-limit": [ { "numeric": [ "=", 3.018e2 ] } ] }
    ]
  }
}
```

**注意**  
APIs `InvalidEventPatternException`如果使用`$or`结果超过 1000 个规则组合 `PutRule` `CreateArchive``UpdateArchive`，则接受事件模式（例如、、和`TestEventPattern`）将抛出。  
要确定事件模式中规则组合的数量，请将事件模式中每个 `$or` 数组的参数总数相乘。例如，上面的模式包含一个 `$or` 数组，带有三个参数，因此规则组合的总数也是三个。如果您再添加一个包含两个参数的 `$or` 数组，则规则组合总数将为六个。

# Amazon EventBridge 事件模式的最佳实践
最佳实践

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

## 避免编写无限循环


在中 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)。

## 使事件模式尽可能精确
使之尽可能精确

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

事件模式可以包括筛选器，匹配以下内容：
+ 有关该事件的事件元数据，例如 `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)。

### 将事件源和详细信息类型指定为筛选器


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

### 指定账户和区域作为筛选条件


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

### 指定内容筛选器


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

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

## 确定事件模式的范围，将事件源更新纳入考虑范围
针对未来更新确定范围

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

例如，假设您要与来自新的微服务的事件进行匹配，该服务发布与支付相关的事件。最初，该服务使用域 `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"
}
```

## 验证事件模式
验证

为确保规则与所需事件相匹配，我们强烈建议您验证您的事件模式。您可以使用 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 测试您的事件模式。