View a markdown version of this page

支持的内容类型:JSON、Avro、Protobuf 和原始字节 - 亚马逊 EventBridge

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

支持的内容类型: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。如果找不到或读取架构,或者无法对该架构进行反序列化负载,则该条目会因每次输入错误而失败,并且请求中的其他条目不受影响。

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

  4. EventBridge 将订阅者的转换应用于反序列化的 JSON,并将 JSON 传递给目标。

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

反序列化后,该事件的行为与发布的任何 JSON 事件类似。PutRawEvents一种过滤器,其范围是按架构名称DATA匹配反序列化记录的字段,JsoNata 转换器对这些字段进行寻址$events.Data,目标接收 JSON。 EventBridge 还在交付的物品中设置了三个密钥SystemMetadata。

  • aws:SchemaId:使用 EventBridge 反序列化模式的标识符;Glue 的 UUID,Conf AWS luent 的整数。

  • aws:RegistryType:解码事件的注册表,Glue或Confluent。使用 n PutEvents ever arry it 发布的活动。

  • ContentType:例如,已发布条目的内容类型application/avro。

选择如何 EventBridge 交付您的有效载荷

ContentType选择两种交付路径之一。

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

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

使用反序列化 AWS Glue 模式注册表

设置RegistryUri为注册表 ARN,格式arn:aws:glue:region:account-id:registry/name为。在发布之前, EventBridge 使用适用于您的语言的 AWS Glue Schema Registry 序列化器对负载进行编码;序列化器嵌入了用于解析和反序列化事件的架构引用。

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。该连接必须属于主叫账户;跨账户连接被拒绝。在首次发布之前创建连接。在发布之前, EventBridge 使用适用于您的语言的 Confluent 序列化器对负载进行编码;序列化器嵌入了用于解析和反序列化事件的架构引用。

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" } } } ] }

如果使用客户管理的密钥对连接密 AWS KMS 钥进行加密,则还要授予kms:Decrypt该密钥。

使用 Confluent URL 和连接 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。仅当两个事件的原始有效载荷字节相同时,两个事件才会重复。因此,以不同格式发布的相同逻辑事件不会被去重:即使反序列化为相同的数据,Avro 字节、Protobuf 字节和原始 JSON 在网络上也会有所不同。请参阅对自定义事件总线上的事件进行排序和重复数据消除。

错误

  • 发布时未SchemaRegistryConfiguration出现失败的 Avro 或 Protobuf 条目是按条目出错,VALIDATION_ERROR且显示ErrorCode的消息显示为。SchemaRegistryConfiguration is required请求中的其他条目不受影响。

  • 如果没有命名可用连接,或者属于另一个账户,则输入失败,VALIDATION_ERROR并显示一条命名注册表的消息。ConnectionArn

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

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

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