Amazon EventBridge 输入转换
在 EventBridge 将信息传递给规则的目标之前,您可以自定义事件的文本。可以使用控制台或 API 中的输入转换器定义变量,使用 JSON 路径来引用原始事件源中的值。转换后的事件将发送到目标,而不是原始事件。但是,动态路径参数必须引用原始事件,而不是转换后的事件。您最多可以定义 100 个变量,同时从输入中为每个变量分配一个值。然后,您可以在输入模板 中以 <variable-name> 形式使用这些变量。
使用输入转换器的教程请参阅教程:在 EventBridge 中使用输入转换器转换事件。
注意
EventBridge 不支持所有 JSON 路径语法,并在运行时对其进行评估。支持的语法包括:
点表示法(例如
$.detail)短划线
下划线
字母数字字符
数组索引
通配符 (*)
本主题内容:
预定义变量
您可以在不定义 JSON 路径的情况下使用预定义的变量。这些变量是保留的,您不能使用这些名称创建变量。
-
aws.events.rule-arn- EventBridge 规则的 Amazon 资源名称 (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 路径来引用事件中的项目,并将这些值存储在变量中。例如,您可以通过在第一个文本框中输入以下内容来创建一个输入路径,以引用示例事件中的值。您也可以使用方括号和索引从数组中获取项目。
注意
EventBridge 会在运行时替换输入转换器,以确保有效的 JSON 输出。因此,请在引用 JSON 路径参数的变量前后加引号,但不要在引用 JSON 对象或数组的变量前后加引号。
{
"timestamp" : "$.time",
"instance" : "$.detail.instance-id",
"state" : "$.detail.state",
"resource" : "$.resources[0]"
}
这些代码会定义四个变量,<timestamp>、<instance>、<state> 和 <resource>。您可以在创建输入模板 时引用这些变量。
注意
Amazon CloudWatch Logs 和 SSM 目标不支持在其输入转换器中使用 Input 和 InputPath。
输入模板
输入模板 是您要传递给目标的信息的模板。您可以创建将字符串或 JSON 传递到目标的模板。使用上一个事件和输入路径,以下输入模板 示例将事件转换为示例输出,然后再将其路由到目标。
| 描述 | 模板 | 输出 |
|---|---|---|
| 简单字符串 |
|
|
|
带转义引号的字符串 |
|
请注意,这是 EventBridge 控制台中的行为。Amazon CLI 对斜杠字符进行转义,结果为 |
|
简单的 JSON |
|
|
|
带有字符串和变量的 JSON |
|
|
|
混合变量和静态信息的 JSON |
|
|
|
在 JSON 中包含保留变量 |
|
|
|
在字符串中包含保留变量 |
|
|
|
Amazon CloudWatch 日志组 |
|
|
使用 EventBridge API 转换输入
有关将 EventBridge API 用于输入转换的信息,请参阅使用输入转换器从事件中提取数据并将该数据输入到目标。
使用 Amazon CloudFormation 转换输入
有关使用 Amazon CloudFormation 转换输入的信息,请参阅 AWS::Events::Rule InputTransformer。
转换输入的常见问题
这些是在 EventBridge 中转换输入时会遇到的一些常见问题:
-
对于字符串,需要引号。
-
为模板创建 JSON 路径时不进行验证。
-
如果您指定一个变量,匹配在事件中不存在的 JSON 路径,则不会创建该变量,并且不会在输出中显示该变量。
-
像
aws.events.event.json这样的 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)文本输出,请用双引号将输入模板中的每行单独括起来。
例如,在将 Amazon Inspector Finding 事件与以下事件模式进行匹配:
{ "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>"