本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Pip EventBridge es 输入转换
Amazon Pip EventBridge es 在将数据传递到浓缩和目标时支持可选的输入转换器。您可以使用输入转换器来重塑JSON事件输入有效负载,以满足丰富服务或目标服务的需求。对于 Amazon API Gateway 和API目的地,您可以通过这种方式根据自己的RESTful模型调整输入事件API。输入转换器作为 InputTemplate
参数建模。它们可以是自由文本、事件负载的JSON路径或包含事件负载内联JSON路径的JSON对象。对于富集,事件负载来自源。对于目标,如果在管道中配置了富集,则事件负载是从富集中返回的内容。除了事件负载中的服务特定数据外,您还可以使用 InputTemplate
中的保留变量来引用管道的数据。
要访问数组中的项目,请使用方括号表示法。
注意
EventBridge 不支持所有 JSON Path 语法并在运行时对其进行评估。支持的语法包括:
点表示法(例如
$.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>
- 输入转换器接收到的事件。对于富集输入转换器,这是来自源的事件。它包含来自源的原始负载,以及其他特定于服务的元数据。如需特定于此服务的示例,请参阅 Amazon Pi EventBridge pes 来源中的主题。
对于目标输入转换器,这是由富集返回的事件(如果已配置富集),不包含其他元数据。因此,浓缩返回的有效载荷可能不是-。JSON如果未在管道中配置富集,则这是来自源的事件,包含元数据。
<aws.pipes.event.json>
— 与相同aws.pipes.event
,但只有当原始有效载荷(来自源或由浓缩返回的)为时,该变量才有值JSON。如果管道具有编码字段,例如 Amazon SQSbody
字段或data
Kinesis,则这些字段将被解码并转换为有效字段。JSON由于该变量未被转义,因此只能用作JSON字段的值。有关更多信息,请参阅 隐式正文数据解析。
输入转换示例
以下是我们可以用作示例EC2事件的 Amazon 事件示例。
{
"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转义,例如亚马逊SQSbody
对象,也可以使用 base64 编码(例如 Kinesis 对象)。data
对于筛选和输入转换, EventBridge 将这些字段转换为有效字段,JSON以便可以直接引用子值。例如,适用于 Kinesis 的 <$.data.someKey>
。
要让目标接收原始负载(不包含任何其他元数据),请针对特定于源的正文数据使用输入转换器。例如,<$.body>
适用于亚马逊SQS或 Kines <$.data>
is。如果原始有效载荷是有效的JSON字符串(例如{"key": "value"}
),则使用带有源特定主体数据的输入转换器将导致原始源有效载荷中的引号被删除。例如,在传送到目标时,{"key": "value"}
会变成 "{key: value}"
。如果您的目标需要有效的JSON负载(例如 Lamb EventBridge da 或 Step Functions),这将导致交付失败。要让目标接收原始源数据而不生成无效数据JSON,请将源主体数据输入转换器封装进去JSON。例如,{"data": <$.data>}
。
隐式正文解析还可用于动态填充大多数管道目标或富集参数的值。有关更多信息,请参阅 动态路径参数
注意
如果原始有效载荷有效JSON,则此字段将包含未转义的、非 JSON base64 编码的。但是,如果有效负载无效JSON,则会对下面列出的字段进行 EventBridge base64 编码,但亚马逊除外。SQS
Active MQ -
data
Kinesis -
data
亚马逊 MSK —
key
以及value
Rabbit MQ -
data
自托管 Apache Kafka -
key
和value
亚马逊 SQS —
body
转换输入的常见问题
以下是在 EventBridge 管道中转换输入时的一些常见问题:
-
对于字符串,需要引号。
-
为模板创建JSON路径时不进行验证。
-
如果您指定一个变量来匹配事件中不存在的JSON路径,则该变量不会被创建,也不会出现在输出中。
-
JSON像这样的属性
aws.pipes.event.json
只能用作JSON字段的值,不能在其他字符串中内联。 -
EventBridge 填充目标的输入模板时,不会转义输入路径提取的值。
-
如果JSON路径引用了JSON对象或数组,但在字符串中引用了该变量,则 EventBridge 删除所有内部引号以确保字符串有效。例如,“正文为 <$.body>” 将导致从对象中 EventBridge 删除引号。
因此,如果要基于单JSON路径变量输出JSON对象,则必须将其作为密钥放置。在本示例中,
{"body": <$.body>}
。 -
表示字符串的变量不需要引号。允许使用它们,但是 Pip EventBridge es 会在转换过程中自动为字符串变量值添加引号,以确保转换输出有效JSON。 EventBridge 管道不会为表示JSON对象或数组的变量添加引号。不要为表示JSON对象或数组的变量添加引号。
例如,以下输入模板包含同时表示字符串和JSON对象的变量:
{ "pipeArn" : <aws.pipes.pipe-arn>, "pipeName" : <aws.pipes.pipe-name>, "originalEvent" : <aws.pipes.event.json> }
如果引号正确JSON,则生效:
{ "pipeArn" : "arn:aws:events:us-east-2:123456789012:pipe/example", "pipeName" : "example", "originalEvent" : { ... // commented for brevity } }
-
对于 Lambda 或 Step Functions 的扩充或目标,即使批次大小为 1,批次也会以JSON数组的形式传送到目标。但是,输入转换器仍将应用于JSON数组中的单个记录,而不是整个数组。有关更多信息,请参阅 Amazon Pip EventBridge es 批处理和并发。