

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

# 支持的内容类型：JSON、Avro、Protobuf 和原始字节
<a name="eb-custom-bus-open-formats"></a>

`PutRawEvents`接受任何字节。每个条目都`SystemMetadata.ContentType`说明字节 EventBridge是什么。该值决定在有效负载过滤和传递事件之前是否对其进行 EventBridge 反序列化。对于 Avro 和 Protobuf，根据您在请求中命名的架构注册表反 EventBridge 序列化有效负载。然后，订阅者将事件进行筛选、转换并以 JSON 格式接收。对于不透明字节， EventBridge 传送有效载荷不变。


| `ContentType` | 有效载荷是 EventBridge 怎么处理的 | 架构注册表 | 
| --- | --- | --- | 
| application/json | 对 JSON 内容进行过滤和转换 | 未使用 | 
| application/avro | 将 Avro 二进制文件反序列化为 JSON，然后在该 JSON 上进行过滤和转换 | 必填 | 
| application/protobuf | 将 Protobuf 二进制文件反序列化为 JSON，然后在该 JSON 上进行过滤和转换 | 必填 | 
| application/octet-stream | 不反序列化或检查有效负载。按发送时传送字节 | 未使用 | 

## 如何 EventBridge 反序列化有效负载
<a name="eb-custom-bus-open-formats-how"></a>

当条目`ContentType`为`application/avro`或时`application/protobuf`，对该条目 EventBridge 执行以下步骤。

1. EventBridge 读取注册表的序列化程序写入有效载荷字节的架构标识符。

1. EventBridge 从您命名的注册表中获取匹配的架构`SchemaRegistryConfiguration.RegistryUri`，并将有效负载反序列化为 JSON。如果找 EventBridge不到或读取架构，或者无法对其反序列化有效负载，则该条目将失败，并显示每个条目错误。请求中的其他条目不受影响。

1. 如果订阅者定义了过滤器，则根据反序列化的 JS EventBridge ON 对其进行评估。

1. EventBridge 将订阅者的转换应用于反序列化的 JSON，并将 JSON 传送给目标。

您可以在中为每个`PutRawEvents`请求命名注册表`SchemaRegistryConfiguration.RegistryUri`。该设置属于请求，而不是总线，对于同一请求中的 JSON 条目，该设置 EventBridge 会忽略该设置。 EventBridge 使用调用者的凭据读取注册表，因此发布的身份需要对注册表的读取权限。

反序列化后，该事件的行为就像使用发布的任何 JSON 事件一样。`PutRawEvents`一种筛选器，其范围为按架构名称`DATA`匹配反序列化记录的字段。JSonata 转换器在下方寻址它们`$events.Data`，目标接收的是 JSON。 EventBridge 还在交付中设置了三个密钥`SystemMetadata`。
+ `aws:SchemaId`：使用 EventBridge 反序列化的架构的标识符；Glue 的 UUID，Conflu Amazon ent 的整数。
+ `aws:RegistryType`: 解码事件的注册表，`Glue`或`Confluent`。使用 nev `PutEvents` er carry it 发布的事件。
+ `ContentType`：例如，已发布条目的内容类型`application/avro`。

## 选择有效载荷的 EventBridge 运送方式
<a name="eb-custom-bus-open-formats-delivery"></a>

`ContentType`选择两个传送路径之一。
+ **反序列化为 JSON。**设置`ContentType`为`application/avro`或`application/protobuf`。 EventBridge 根据您的架构注册表反序列化有效负载，订阅者可以进行`DATA`筛选，使用 jsonata 进行转换并接收 JSON。当您想要基于内容的路由和重塑架构编码的事件时，请使用此路径。
+ **原封不动地传送字节。**设置`ContentType`为`application/octet-stream`。 EventBridge 不反序列化或检查有效负载，不涉及架构注册表，并且订阅者会收到您发送的确切字节。当你自己在目标位置反序列化有效载荷时，或者当内容是 EventBridge 未反序列化的格式时，请使用此路径。

## 使用反序列化 Amazon Glue 架构注册表
<a name="eb-custom-bus-open-formats-glue"></a>

设置`RegistryUri`为注册表 ARN，格式为。`arn:aws:glue:{{region}}:{{account-id}}:registry/{{name}}`发布之前，请使用适用于您的语言的 Glue Schema Regi Amazon stry 序列化程序对有效负载进行编码。序列化程序嵌入了 EventBridge 用于解析和反序列化事件的架构引用。

EventBridge 以发布调用者的身份读取架构，因此授予发布身份对注册表及其架构的读取权限。以下策略授予最低权限，范围仅限于一个注册表。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "glue:GetSchemaVersion",
            "Resource": [
                "arn:aws:glue:us-east-1:111122223333:registry/orders",
                "arn:aws:glue:us-east-1:111122223333:schema/orders/*"
            ]
        }
    ]
}
```

使用 Glue 注册表 ARN 发布架构编码字节。`RegistryUri`

```
aws eventsv2 put-raw-events \
    --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \
    --schema-registry-configuration RegistryUri=arn:aws:glue:us-east-1:111122223333:registry/orders \
    --entries '[
        {
            "Data": "{{base64-encoded-avro-bytes}}",
            "SystemMetadata": { "ContentType": "application/avro", "EventGroupId": "order-1001" }
        }
    ]'
```

然后，订阅者对反序列化的记录进行筛选。如果 Avro 架构有一个名为的字段`orderId`，则以下筛选器将匹配一个顺序。

```
{ "Scope": "DATA", "Pattern": "{\"orderId\":[\"1001\"]}" }
```

## 使用 Confluent 架构注册表进行反序列化
<a name="eb-custom-bus-open-formats-confluent"></a>

设置`RegistryUri`为注册表的 HTTPS 网址。HTTPS 注册表还需要`SchemaRegistryConfiguration.ConfluentPublicRegistryConfiguration.ConnectionArn`包含注册表 API 密钥或 OAuth 凭据的 EventBridge 连接的 ARN。该连接必须属于主叫账户；跨账户连接被拒绝。在首次发布之前创建连接。发布之前，请使用适用于您的语言的 Confluent 序列化程序对有效负载进行编码。序列化程序嵌入了 EventBridge 用于解析和反序列化事件的架构引用。

EventBridge 通过您命名的连接读取注册表凭据。向发布身份授予读取该连接凭据的权限。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "events:RetrieveConnectionCredentials",
            "Resource": "arn:aws:events:us-east-1:111122223333:connection/confluent-registry/*"
        },
        {
            "Effect": "Allow",
            "Action": ["secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret"],
            "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:events!connection/confluent-registry/*",
            "Condition": { "Bool": { "aws:ViaAWSService": "true" } }
        }
    ]
}
```

如果使用客户管理的密钥对连接密 Amazon KMS 钥进行加密，则还要对该密钥`kms:Decrypt`进行授权。

使用 Confluent 网址和连接 ARN 发布架构编码的字节。

```
aws eventsv2 put-raw-events \
    --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \
    --schema-registry-configuration '{
        "RegistryUri": "https://psrc-example.us-east-1.aws.confluent.cloud",
        "ConfluentPublicRegistryConfiguration": {
            "ConnectionArn": "arn:aws:events:us-east-1:111122223333:connection/confluent-registry/EXAMPLE-1234-5678-abcd"
        }
    }' \
    --entries '[
        {
            "Data": "{{base64-encoded-protobuf-bytes}}",
            "SystemMetadata": { "ContentType": "application/protobuf" }
        }
    ]'
```

### 连接身份验证选项
<a name="eb-custom-bus-open-formats-confluent-auth"></a>

使用 Confluent 注册表所需的身份验证类型配置连接。 EventBridge 仅读取连接生成的身份验证标头；它永远不会看到原始密钥，并且会自动刷新 OAuth 令牌。

**API 密钥。**Confluent 架构注册表通常使用 HTTP 基本身份验证，使用架构注册表 API 密钥作为用户名，API 密钥作为密码。

```
aws events create-connection \
    --name confluent-registry \
    --authorization-type API_KEY \
    --auth-parameters '{
        "ApiKeyAuthParameters": {
            "ApiKeyName": "Authorization",
            "ApiKeyValue": "Basic {{base64(srApiKey:srApiSecret)}}"
        }
    }'
```

**OAuth 客户端凭证。** EventBridge 获取并刷新令牌。必须`grant_type=client_credentials`将其作为正文参数包括在 EventBridge 内；不要为您添加。

```
aws events create-connection \
    --name confluent-registry-oauth \
    --authorization-type OAUTH_CLIENT_CREDENTIALS \
    --auth-parameters '{
        "OAuthParameters": {
            "AuthorizationEndpoint": "https://{{idp-domain}}/oauth/token",
            "HttpMethod": "POST",
            "ClientParameters": {
                "ClientID": "{{oauth-client-id}}",
                "ClientSecret": "{{oauth-client-secret}}"
            },
            "OAuthHttpParameters": {
                "BodyParameters": [
                    { "Key": "grant_type", "Value": "client_credentials", "IsValueSecret": false }
                ]
            }
        }
    }'
```

EventBridge 将任一凭据存储在托管 Secrets Manager 密钥 (`events!connection/...`) 中，连接会代表你读取该密钥。

## 在不进行反序列化的情况下传送字节
<a name="eb-custom-bus-open-formats-passthrough"></a>

要使 EventBridge 传送的有效载荷与发送的内容完全相同，请将条目设置`SystemMetadata.ContentType`为`application/octet-stream`。这是每个条目中的一个字段，而不是 HTTP 标头。 EventBridge 不反序列化字节或检查字节，也不涉及架构注册表。任何格式都有效，包括你在目标位置反序列化自己的 Avro 或 Protobuf。

由于内容不透明，因此`DATA`过滤器无法与之匹配。在开启过滤器`METADATA`、使用你在条目`Metadata`地图中设置的按键或开启的情况下路由此类事件`SYSTEM_METADATA`。 Content-based 重复数据删除仍然有效，并且会完全按照您发送的字节进行哈希处理。在变压器中，有效载荷显示为 Base64 字符串；请参阅[使用 JSonata 转换事件](eb-custom-bus-transform.md)。

## 筛选和转换反序列化事件
<a name="eb-custom-bus-open-formats-filtering"></a>

将事件 EventBridge 反序列化为 JSON 后，有效负载就会流过普通管道。范围为的过滤器根据其架构名称`DATA`匹配反序列化的字段，而JSonata转换器则在下方对其进行寻址。`$events.Data`作为 Avro 或 Protobuf 发布的事件与以纯 JSON 形式发布的事件具有相同的基于内容的路由和每个订阅者的重塑。根据反序列化的 JSON 编写过滤器模式，同时牢记两条转换规则。
+ **Avro** 反序列化为标准 JSON。转换是单向的：无法将 JSON 转换回 Avro 对象。
+ **Protobuf** 使用架构中定义的字段名称反序列化为 JSON，而不是像 Protobuf 工具通常那样将它们转换为驼峰大小写。匹配架构字段名称。

## 对不同格式的事件进行重复数据消除
<a name="eb-custom-bus-open-formats-dedup"></a>

EventBridge 支持两种重复数据删除模式： ID-based一种是在条目`DeduplicationId`上提供，另一种是基于内容， EventBridge 用于计算事件内容的 SHA-256 哈希值。对于反序列化事件，基于内容的重复数据删除会对原始 Avro 或 Protobuf 线字节进行哈希处理，而不是对反序列化的 JSON 进行哈希处理。只有当两个事件的原始有效载荷字节相同时，它们才是重复的。 EventBridge 因此，不会对以不同格式发布的同一个逻辑事件进行重复数据删除。Avro 字节、Protobuf 字节和原始 JSON 在网络上会有所不同，即使它们反序列化为相同的数据。请参阅[在自定义事件总线上对事件进行排序和重复事件删除](eb-custom-bus-ordering.md)。

## 错误
<a name="eb-custom-bus-open-formats-errors"></a>
+ 未发布的 Avro 或 Protobuf 条目`SchemaRegistryConfiguration`失败为每个条目错误，并显示为 of `VALIDATION_ERROR` 和一条`ErrorCode`说明的消息。`SchemaRegistryConfiguration is required`请求中的其他条目不受影响。
+ 未命名可用连接或属于其他帐户的 A 将失败，`VALIDATION_ERROR`并显示一条命名注册表的消息。`ConnectionArn`
+ 无法找到或读取的架构，或者无法对其进行反序列化的有效负载，会导致该条目失败。`VALIDATION_ERROR`此错误不可重试；请先修复请求或调用者的注册表访问权限，然后再重新发布。
+ 无法访问的注册表会使请求失败`SchemaRegistryUnavailableException`。在 Confluent OAuth 路径上，可能会在刷新注册表访问令牌时发生这种情况。此错误是暂时性的；请使用退避重试请求。

有关每项参赛结果和一般重试指南，请参阅。[将事件发布到自定义事件总线](eb-custom-bus-publish.md)