

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

# 为订阅者筛选事件
<a name="eb-custom-bus-filtering"></a>

过滤器选择订阅者接收的事件。使用一个或多个过滤器将 a 附加`FilterConfiguration`到订阅者，每个过滤器命名 EventBridge 事件模式语法`Pattern`中的 a `Scope` 和 a。例如，具有该模式的`DATA`过滤器仅`{"detail":{"amount":[{"numeric":[">",500]}]}}`交付已发布的 500 个以上的订单`PutEvents`。本页描述了过滤器模型；有关模式运算符，请参阅[亚马逊 EventBridge 事件模式](eb-event-patterns.md)。订阅者过滤器不支持通配符匹配。

## 过滤的工作原理
<a name="eb-custom-bus-filtering-how"></a>

每个过滤器都有两个部分：a`Scope`，这是过滤器检查的事件的一部分（`DATA``METADATA`、或`SYSTEM_METADATA`；参见[事件结构：数据、元数据和系统元数据](eb-custom-bus-addressing.md)）；a`Pattern`，以 JSON 字符串形式提供的事件模式。 EventBridge 将配置中的过滤器与 AND 相结合：在订阅者收到之前，事件必须匹配每个过滤器。没有的订阅者`FilterConfiguration`接收所有事件。

## 三个范围
<a name="eb-custom-bus-filtering-scopes"></a>

`DATA`  
检查事件数据。因为`PutRawEvents`，数据就是你发送的有效载荷。因为`PutEvents`，数据就是 EventBridge 信封，而你的`Detail`则嵌套在`detail`密钥下面。`DATA`过滤器支持除通配符之外的所有事件模式运算符。 EventBridge 将`application/protobuf`事件反序列`application/avro`化为 JSON，`DATA`过滤器会像检查任何 JSON 事件一样检查该 JSON。`application/octet-stream`事件没有过滤器可以读取的数据，因此拥有过滤器的订阅者永远不会匹配`DATA`过滤器；`METADATA``SYSTEM_METADATA`过滤器仍然可以对其起作用。

`METADATA`  
检查出版商设置的键值对。`Metadata` `PutRawEvents``METADATA`过滤器仅匹配精确值：模式中的每个值必须是精确值的 JSON 数组，`$or`并且不支持`prefix``numeric`、`exists`、和等运算符。要使用这些运算符，请筛选`DATA`或`SYSTEM_METADATA`。一个`PutEvents`事件没有发布者元数据，因此`METADATA`过滤器永远不会与之匹配。

`SYSTEM_METADATA`  
检查下表中列出的事件字段 EventBridge 集。`SYSTEM_METADATA`过滤器支持除通配符之外的所有事件模式运算符。 EventBridge 生成的字段带有前`aws:`缀。


| 字段 | 说明 | 现身 | 
| --- | --- | --- | 
| ContentType | 事件数据的内容类型 | 每场活动 | 
| DeduplicationId | 重复数据删除标识符 | 每场活动 | 
| EventGroupId | 活动组 | 每场活动 | 
| aws:EventId |  EventBridge 分配的标识符 | 每场活动 | 
| aws:IngestionTime |  EventBridge 收到活动时 | 每场活动 | 
| aws:SequenceNumber |  EventBridge 分配的序列号 | 每场活动 | 
| aws:DeliveryType | LIVE 或 REPLAY | 每场已举办的活动 | 
| aws:SchemaId | 注册表中的架构标识符：Glue 的版本 UUID，Confluent 的整数 | Avro 和 Protobuf 活动 | 
| aws:RegistryType | Glue 或 Confluent | Avro 和 Protobuf 活动 | 
| aws:Source | 事件的来源 | PutEvents、 Amazon 服务和 SaaS 合作伙伴活动 | 
| aws:DetailType | 事件的详细信息类型 | PutEvents、 Amazon 服务和 SaaS 合作伙伴活动 | 

**注意**  
要筛选 Amazon 服务事件或 SaaS 合作伙伴事件，请使用`aws:Source`和`aws:DetailType`。 EventBridge 写入这些字段，任何发布调用都无法设置以此开头的来源`aws.`，因此它们可以识别事件的经过验证的来源。请勿将事件数据中的`source`和`detail-type`字段用于此目的；任何发布商都可以写入这些字段。请参阅[自定义事件总线的事件源](eb-custom-bus-event-sources.md)。

## 示例：筛选使用发布的事件 PutRawEvents
<a name="eb-custom-bus-filtering-raw-example"></a>

`PutRawEvents`发布内容类型的有效负载。`DATA`过滤器直接匹配负载，`METADATA`过滤器匹配发布者的元数据地图。以下配置每个范围都有一个过滤器；只有当所有三个过滤器都匹配时，订阅者才会收到事件：有效负载超过 500，元数据密钥`region`为`EU`，内容类型为 JSON。`amount`

```
{
    "Filters": [
        { "Scope": "DATA", "Pattern": "{\"amount\":[{\"numeric\":[\">\",500]}]}" },
        { "Scope": "METADATA", "Pattern": "{\"region\":[\"EU\"]}" },
        { "Scope": "SYSTEM_METADATA", "Pattern": "{\"ContentType\":[\"application/json\"]}" }
    ]
}
```

## 示例：筛选使用发布的事件 PutEvents
<a name="eb-custom-bus-filtering-putevents-example"></a>

`PutEvents`在 EventBridge 信封中发布一个事件，该活动以条目的`Source`、、`DetailType``Resources``Time`、和为基础构建`Detail`。`DATA`过滤器与该信封相匹配，您的`Detail`嵌套在下方`detail`。该事件`ContentType`是`application/eventbridge+json`、`aws:Source``aws:DetailType`来自参赛作品的`Source`和`DetailType`，信封也暴露`source``detail-type`在`DATA`范围内。当详细信息超过 500 且来源为 500 时，以下配置匹配`com.myapp.storage`。`amount`

```
{
    "Filters": [
        { "Scope": "DATA", "Pattern": "{\"detail\":{\"amount\":[{\"numeric\":[\">\",500]}]}}" },
        { "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:Source\":[\"com.myapp.storage\"]}" }
    ]
}
```

## 示例：筛选来自事件源的事件
<a name="eb-custom-bus-filtering-event-source-example"></a>

事件源采集的事件会以 EventBridge 信封的形式到达，发起的服务或合作伙伴也在信封中`aws:Source`。要仅接收针对一个存储桶的 Amazon S3 对象创建的事件，请将中的`SYSTEM_METADATA`服务和中的存储桶进行匹配。`DATA`对于合作伙伴，将合作伙伴事件源名称进行匹配，例如与 `prefix` on 相匹配`aws.partner/example.com`。

```
{
    "Filters": [
        { "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:Source\":[\"aws.s3\"]}" },
        { "Scope": "DATA", "Pattern": "{\"detail-type\":[\"Object Created\"],\"detail\":{\"bucket\":{\"name\":[\"amzn-s3-demo-bucket\"]}}}" }
    ]
}
```

## 行为和极限
<a name="eb-custom-bus-filtering-limits"></a>
+ **AND 组合**：事件必须匹配配置中的每个过滤器。
+ **无过滤器**：没有过滤器配置的订阅者接收所有事件。
+ **每个作用域一个过滤器**：一个配置为每个范围最多包含一个过滤器，因此最多有三个过滤器。 EventBridge 拒绝具有两个相同范围过滤器的配置。
+ **通配符**：`wildcard`运算符和`anything-but`带有通配符的运算符被拒绝，消息*过滤器模式不得包含通配符匹配器（通配符，除通配符之外的任何东西）。*
+ **带有`$or`**:的模式组合会 EventBridge 拒绝`$or`使用产生超过 1,000 个模式组合的过滤器。将每个数`$or`组中的参数数相乘：一个由三个组成的数组给出三种组合，第二个由两个组成的数组给出六个组合。
+ **大小**：配置中的所有过滤器在三个作用域中共享一个 4,096 字节的限制。
+ **图案形状**：`DATA`模式的根部可以有一个数组；`METADATA`并且`SYSTEM_METADATA`模式必须是 JSON 对象。创建或更新订阅者时，无效 JSON 的模式将被拒绝。
+ **更改**：订阅者的筛选条件可以在任何滚动 24 小时内更改 24 次；请参阅[更新、暂停和恢复订阅者](eb-custom-bus-update.md)。

为错误的形状编写的图案不会失败；它什么都不匹配。在依赖订阅者之前，发布一个应该匹配的事件和一个不应该匹配的事件，然后在目标上检查这两个事件。