亚马逊 EventBridge 管道输入转换 - 亚马逊 EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

亚马逊 EventBridge 管道输入转换

Ama EventBridge zon Pipes 在向扩充和目标传递数据时支持可选的输入转换器。您可以使用输入转换器重构 JSON 事件输入负载,以满足扩充或目标服务的需求。对于Amazon API Gateway 和 API 目的地,这就是您将输入事件塑造为 API 的 RESTful 模型的方式。输入变压器被建模为一个InputTemplate参数。它们可以是自由文本、事件负载的 JSON 路径或包含事件负载的内联 JSON 路径的 JSON 对象。为了丰富起见,事件载荷来自源头。对于目标,如果在管道上配置了扩充后返回的事件载荷。除了事件负载中的特定服务数据外,您还可以在您的中使用预留变量InputTemplate来引用管道的数据。

要访问数组中的项目,请使用方括号表示法。

注意

EventBridge 不支持所有 JSON 路径语法并在运行时对其进行评估。支持的语法包括:

  • 点符号(例如,$.detail

  • 猛冲

  • 下划线

  • 字母数字字符

  • 数组索引

  • 通配符 (*)

以下是引用 Amazon SQS 事件负载的示例InputTemplate参数:

静态字符串

InputTemplate: "Hello, sender"

json 路径

InputTemplate: <$.attributes.SenderId>

动态字符串

InputTemplate: "Hello, <$.attributes.SenderId>"

静态 json

InputTemplate: > { "key1": "value1", "key2": "value2", "key3": "value3", }

动态 JSON

InputTemplate: > { "key1": "value1" "key2": <$.body.key>, "d": <aws.pipes.event.ingestion-time> }

使用方括号表示法访问数组中的项目:

InputTemplate: > { "key1": "value1" "key2": <$.body.Records[3]>, "d": <aws.pipes.event.ingestion-time> }
注意

EventBridge 在运行时替换输入转换器以确保有效的 JSON 输出。因此,请在引用 JSON 路径参数的变量前后加上引号,但不要在引用 JSON 对象或数组的变量前后加上引号。

预留变量

输入模板可以使用以下预留变量:

  • <aws.pipes.pipe-arn>— 管道的 Amazon 资源名称(ARN)。

  • <aws.pipes.pipe-name>— 管道的名称。

  • <aws.pipes.source-arn>— 管道的事件源的 ARN。

  • <aws.pipes.enrichment-arn>— 扩充管道的 ARN。

  • <aws.pipes.target-arn>— 管道目标的 ARN。

  • <aws.pipes.event.ingestion-time>— 输入变压器接收事件的时间。这是 ISO 8601 时间戳。这段时间对于浓缩输入变压器和目标输入变压器来说是不同的,具体取决于浓缩操作何时完成对事件的处理。

  • <aws.pipes.event>— 输入变压器接收到的事件。

    对于浓缩输入变压器来说,这是来自源的事件。这包含来自源的原始负载以及其他特定于服务的元数据。有关特定服务的示例亚马逊 EventBridge 管道消息来源,请参阅中的主题。

    对于目标输入转换器,如果配置了增益转换器,则这是扩展返回的事件,没有额外的元数据。因此,浓缩返回的有效载荷可能是非 JSON。如果未在管道上配置扩展,则这是来自带有元数据的源事件。

  • <aws.pipes.event.json>— 与aws.pipes.event,但只有当原始有效负载(来自源或由扩充返回的原始有效载荷)为 JSON 时,变量才有值。如果管道有编码字段,例如 Amazon SQSbody 字段或 Kinesisdata,则这些字段将被解码并转换为有效的 JSON。由于该变量未经过转义,因此只能用作 JSON 字段的值。有关更多信息,请参阅隐式正文数据解析

输入转换示例

以下是我们可以用作示例事件的 Amazon EC2 事件

{ "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-0123456789", "state": "RUNNING" } }

让我们使用以下 JSON 作为我们的转换器

{ "instance" : <$.detail.instance-id>, "state": <$.detail.state>, "pipeArn" : <aws.pipes.pipe-arn>, "pipeName" : <aws.pipes.pipe-name>, "originalEvent" : <aws.pipes.event.json> }

以下将是生成的输出

{ "instance" : "i-0123456789", "state": "RUNNING", "pipeArn" : "arn:aws:pipe:us-east-1:123456789012:pipe/example", "pipeName" : "example", "originalEvent" : { ... // commented for brevity } }

隐式正文数据解析

传入负载中的以下字段可能是 JSON 转义的,例如 Amazon SQSbody 对象,也可以是 base64 编码的,例如 Kinesisdata 对象。对于筛选和输入转 EventBridge 换,将这些字段转换为有效的 JSON,以便可以直接引用子值。例如,对<$.data.someKey>于 Kinesis 来说。

要让目标接收原始有效载荷而无需任何其他元数据,请使用特定于源主体的输入转换器,其中包含该主体数据。例如,<$.body>适用于Amazon SQS 或 Kines<$.data> is。如果原始负载是有效的 JSON 字符串(例如{"key": "value"}),则将输入转换器与源特定主体数据一起使用将导致原始源负载中的引号被删除。例如,"{key: value}"在传送到目标时{"key": "value"}将变为。如果您的目标需要有效的 JSON 有效负载(例如 EventBridge Lambda 或 Step Functions),这将导致交付失败。要让目标在不生成无效的 JSON 的情况下接收原始源数据,请将源主体数据输入转换器封装在 JSON 中。例如,{"data": <$.data>}

隐式正文解析也可以用于动态填充大多数管道目标或丰富参数的值。有关更多信息,请参阅 动态路径参数

注意

如果原始负载是有效的 JSON,则此字段将包含未转义的非 base64 编码的 JSON。但是,如果有效负载不是有效的 JSON,则对下面列出的字段 EventBridge 进行 base64 编码,Amazon SQS 除外。

  • Active MQdata

  • Kinesisdata

  • 亚马逊 MSKkey 以及value

  • Rabbit MQdata

  • 自我管理的 Apache Kafka;key 以及value

  • Amazon SQSbody

转换输入的常见问题

以下是转换 EventBridge 管道中的输入时的一些常见问题:

  • 对于字符串,需要引号。

  • 为模板创建 JSON 路径时不进行验证。

  • 如果您指定一个变量来匹配事件中不存在的 JSON 路径,则该变量不会被创建,也不会出现在输出中。

  • 像 JSON 这样的属性aws.pipes.event.json只能用作 JSON 字段的值,不能内联到其他字符串中。

  • EventBridge 在为目标填充输入模板时,不会转义输入路径提取的值。

  • 如果 JSON 路径引用了 JSON 对象或数组,但该变量在字符串中被引用,则 EventBridge 删除所有内部引号以确保字符串有效。例如,“Body is <$.body>” 将导致从对象中 EventBridge 删除引号。

    因此,如果要基于单个 JSON 路径变量输出 JSON 对象,则必须将其作为密钥放置。在这个例子中,{"body": <$.body>}.