View a markdown version of this page

支持的内容类型:JSON、Avro、Protobuf 和原始字节 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

支持的内容类型:JSON、Avro、Protobuf 和原始字节

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 反序列化有效负载

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

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

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

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

  4. 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 运送方式

ContentType选择两个传送路径之一。

  • 反序列化为 JSON。设置ContentType为application/avro或application/protobuf。 EventBridge 根据您的架构注册表反序列化有效负载,订阅者可以进行DATA筛选,使用 jsonata 进行转换并接收 JSON。当您想要基于内容的路由和重塑架构编码的事件时,请使用此路径。

  • 原封不动地传送字节。设置ContentType为application/octet-stream。 EventBridge 不反序列化或检查有效负载,不涉及架构注册表,并且订阅者会收到您发送的确切字节。当你自己在目标位置反序列化有效载荷时,或者当内容是 EventBridge 未反序列化的格式时,请使用此路径。

使用反序列化 Amazon Glue 架构注册表

设置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 架构注册表进行反序列化

设置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" } } ]'

连接身份验证选项

使用 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/...) 中,连接会代表你读取该密钥。

在不进行反序列化的情况下传送字节

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

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

筛选和转换反序列化事件

将事件 EventBridge 反序列化为 JSON 后,有效负载就会流过普通管道。范围为的过滤器根据其架构名称DATA匹配反序列化的字段,而JSonata转换器则在下方对其进行寻址。$events.Data作为 Avro 或 Protobuf 发布的事件与以纯 JSON 形式发布的事件具有相同的基于内容的路由和每个订阅者的重塑。根据反序列化的 JSON 编写过滤器模式,同时牢记两条转换规则。

  • Avro 反序列化为标准 JSON。转换是单向的:无法将 JSON 转换回 Avro 对象。

  • Protobuf 使用架构中定义的字段名称反序列化为 JSON,而不是像 Protobuf 工具通常那样将它们转换为驼峰大小写。匹配架构字段名称。

对不同格式的事件进行重复数据消除

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

错误

  • 未发布的 Avro 或 Protobuf 条目SchemaRegistryConfiguration失败为每个条目错误,并显示为 of VALIDATION_ERROR 和一条ErrorCode说明的消息。SchemaRegistryConfiguration is required请求中的其他条目不受影响。

  • 未命名可用连接或属于其他帐户的 A 将失败,VALIDATION_ERROR并显示一条命名注册表的消息。ConnectionArn

  • 无法找到或读取的架构,或者无法对其进行反序列化的有效负载,会导致该条目失败。VALIDATION_ERROR此错误不可重试;请先修复请求或调用者的注册表访问权限,然后再重新发布。

  • 无法访问的注册表会使请求失败SchemaRegistryUnavailableException。在 Confluent OAuth 路径上,可能会在刷新注册表访问令牌时发生这种情况。此错误是暂时性的;请使用退避重试请求。

有关每项参赛结果和一般重试指南,请参阅。将事件发布到自定义事件总线