亚马逊 EventBridge 输入转换 - Amazon EventBridge

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

亚马逊 EventBridge 输入转换

在将信息 EventBridge传递给规则目标之前,您可以自定义事件中的文本。使用控制台中的输入转换器或API,您可以定义变量,这些变量使用JSON路径来引用原始事件源中的值。转换后的事件将发送到目标,而不是原始事件。但是,动态路径参数必须引用原始事件,而不是转换后的事件。您最多可以定义 100 个变量,同时从输入中为每个变量分配一个值。然后你可以在输入模板中使用这些变量作为 <variable-name>.

使用输入转换器的教程请参阅教程:使用输入转换器转换事件 EventBridge

注意

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

  • 点表示法(例如 $.detail

  • 短划线

  • 下划线

  • 字母数字字符

  • 数组索引

  • 通配符 (*)

预定义变量

有一些预定义的变量可以在不定义JSON路径的情况下使用。这些变量是保留的,您不能使用这些名称创建变量。

  • aws.events.rule-arn— EventBridge 规则的亚马逊资源名称 (ARN)。

  • aws.events.rule-name— EventBridge 规则的名称。

  • aws.events.event.ingestion-time— 接收事件的时间 EventBridge。这是一个 ISO 8601 的时间戳。此变量由生成 EventBridge ,无法覆盖。

  • aws.events.event— 原始事件负载为JSON(不带字detail段)。只能用作JSON字段的值,因为其内容不会被转义。

  • aws.events.event.json— 完整的原始事件有效载荷为JSON。 (带字detail段)。只能用作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" } }

在控制台中定义规则时,选择配置输入下的输入转换器选项。此选项显示两个文本框:一个用于 Input Path (输入路径) ,一个用于 Input Template (输入模板)

输入路径

输入路径 用于定义变量。使用 JSON path 引用事件中的项目,并将这些值存储在变量中。例如,您可以通过在第一个文本框中输入以下内容来创建一个输入路径,以引用示例事件中的值。您也可以使用方括号和索引从数组中获取项目。

注意

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

{ "timestamp" : "$.time", "instance" : "$.detail.instance-id", "state" : "$.detail.state", "resource" : "$.resources[0]" }

这些代码会定义四个变量,<timestamp><instance><state><resource>。您可以在创建输入模板 时引用这些变量。

注意

Amazon CloudWatch 日志和SSM目标不支持在其输入转换器InputPath中使用Input和。

输入模板

输入模板 是您要传递给目标的信息的模板。您可以创建一个将字符串或传递JSON给目标的模板。使用上一个事件和输入路径,以下输入模板 示例将事件转换为示例输出,然后再将其路由到目标。

描述 模板 输出
简单字符串
"instance <instance> is in <state>"
"instance i-0123456789 is in RUNNING"

带转义引号的字符串

"instance \"<instance>\" is in <state>"
"instance \"i-0123456789\" is in RUNNING"

请注意,这是 EventBridge 控制台中的行为。 AWS CLI 对斜杠字符进行转义,结果为 "instance "i-0123456789" is in RUNNING"

简单 JSON

{ "instance" : <instance>, "state": <state> }
{ "instance" : "i-0123456789", "state": "RUNNING" }

JSON使用字符串和变量

{ "instance" : <instance>, "state": "<state>", "instanceStatus": "instance \"<instance>\" is in <state>" }
{ "instance" : "i-0123456789", "state": "RUNNING", "instanceStatus": "instance \"i-0123456789\" is in RUNNING" }

JSON混合了变量和静态信息

{ "instance" : <instance>, "state": [ 9, <state>, true ], "Transformed" : "Yes" }
{ "instance" : "i-0123456789", "state": [ 9, "RUNNING", true ], "Transformed" : "Yes" }

在中包含保留变量 JSON

{ "instance" : <instance>, "state": <state>, "ruleArn" : <aws.events.rule-arn>, "ruleName" : <aws.events.rule-name>, "originalEvent" : <aws.events.event.json> }
{ "instance" : "i-0123456789", "state": "RUNNING", "ruleArn" : "arn:aws:events:us-east-2:123456789012:rule/example", "ruleName" : "example", "originalEvent" : { ... // commented for brevity } }

在字符串中包含保留变量

"<aws.events.rule-name> triggered"
"example triggered"

亚马逊 CloudWatch 日志组

{ "timestamp" : <timestamp>, "message": "instance \"<instance>\" is in <state>" }
{ "timestamp" : 2015-11-11T21:29:54Z, "message": "instance "i-0123456789" is in RUNNING }

使用转换输入 EventBridge API

有关使用转换输入的信息,请参阅使用输入转换器从事件中提取数据并将该数据输入到目标。 EventBridge API

使用转换输入 AWS CloudFormation

有关使用 AWS CloudFormation 转换输入的信息,请参阅AWS:: Events:: Rule。 InputTransformer

转换输入的常见问题

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

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

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

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

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

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

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

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

  • 表示字符串的变量不需要引号。允许使用它们,但在转换过程中 EventBridge 会自动为字符串变量值添加引号,以确保转换输出有效JSON。 EventBridge 不会为表示JSON对象或数组的变量添加引号。不要为表示JSON对象或数组的变量添加引号。

    例如,以下输入模板包含同时表示字符串和JSON对象的变量:

    { "ruleArn" : <aws.events.rule-arn>, "ruleName" : <aws.events.rule-name>, "originalEvent" : <aws.events.event.json> }

    如果引号正确JSON,则生效:

    { "ruleArn" : "arn:aws:events:us-east-2:123456789012:rule/example", "ruleName" : "example", "originalEvent" : { ... // commented for brevity } }
  • 对于(非JSON)文本输出为多行字符串,请用双引号将输入模板中的每个单独行括起来。

    例如,如果您要将 Finding Amazon Inspector 事件与以下事件模式进行匹配:

    { "detail": { "severity": ["HIGH"], "status": ["ACTIVE"] }, "detail-type": ["Inspector2 Finding"], "source": ["inspector2"] }

    并使用以下输入路径:

    { "account": "$.detail.awsAccountId", "ami": "$.detail.resources[0].details.awsEc2Instance.imageId", "arn": "$.detail.findingArn", "description": "$.detail.description", "instance": "$.detail.resources[0].id", "platform": "$.detail.resources[0].details.awsEc2Instance.platform", "region": "$.detail.resources[0].region", "severity": "$.detail.severity", "time": "$.time", "title": "$.detail.title", "type": "$.detail.type" }

    你可以使用下面的输入模板来生成多行字符串输出:

    "<severity> severity finding <title>" "Description: <description>" "ARN: \"<arn>\"" "Type: <type>" "AWS Account: <account>" "Region: <region>" "EC2 Instance: <instance>" "Platform: <platform>" "AMI: <ami>"