

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

# 亚马逊 EventBridge 输入转换
<a name="eb-transform-target-input"></a>

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

使用输入转换器的教程请参阅[教程：在 EventBridge 中使用输入转换器转换事件](eb-input-transformer-tutorial.md)。

**注意**  
EventBridge 不支持所有 JSON 路径语法并在运行时对其进行评估。支持的语法包括：  
点表示法（例如 `$.detail`）
短划线
下划线
字母数字字符
数组索引
通配符 (\$1)
向前斜杠

**Topics**
+ [预定义变量](#eb-transform-input-predefined)
+ [输入转换示例](#eb-transform-input-examples)
+ [使用 EventBridge API 转换输入](#eb-transform-input-api)
+ [使用转换输入 AWS CloudFormation](#eb-transform-input-cfn)
+ [转换输入的常见问题](#eb-transform-input-issues)
+ [在中创建规则时配置输入变压器 EventBridge](eb-transform-input-rule.md)
+ [使用 EventBridge 沙盒测试目标输入变压器](eb-sandbox-input-trans.md)

## 预定义变量
<a name="eb-transform-input-predefined"></a>

您可以在不定义 JSON 路径的情况下使用预定义的变量。这些变量是保留的，您不能使用这些名称创建变量。
+ ****`aws.events.rule-arn`— 规则的亚马逊资源名称 (ARN)。 EventBridge 
+ ****`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 字段的值，因为其内容不会被转义。

## 输入转换示例
<a name="eb-transform-input-examples"></a>

以下是 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 (输入模板)*。

### 输入路径
<a name="eb-transform-target-input-path"></a>

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

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

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

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

**注意**  
Ama CloudWatch zon Logs 和 SSM 目标不支持在其输入转换器`InputPath`中使用`Input`和。

### 输入模板
<a name="eb-transform-target-input-template"></a>

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


| 说明 | 模板 | Output | 
| --- | --- | --- | 
| 简单字符串 |  <pre>"instance <instance> is in <state>"</pre> |  <pre>"instance i-0123456789 is in RUNNING"</pre>  | 
|  **带转义引号的字符串**  |  <pre>"instance \"<instance>\" is in <state>"</pre> |  <pre>"instance \"i-0123456789\" is in RUNNING"</pre> 请注意，这是 EventBridge 控制台中的行为。 AWS CLI 对斜杠字符进行转义，结果为 `"instance "i-0123456789" is in RUNNING"`。  | 
|  **简单的 JSON**  |  <pre>{<br />  "instance" : <instance>,<br />  "state": <state><br />}</pre> |  <pre>{<br />  "instance" : "i-0123456789",<br />  "state": "RUNNING"<br />}</pre>  | 
|  **带有字符串和变量的 JSON**  |  <pre>{<br /> "instance" : <instance>,<br /> "state": "<state>",<br /> "instanceStatus": "instance \"<instance>\" is in <state>"<br />}</pre>  |  <pre>{<br /> "instance" : "i-0123456789",<br /> "state": "RUNNING",<br /> "instanceStatus": "instance \"i-0123456789\" is in RUNNING"<br />}</pre>  | 
|  **混合变量和静态信息的 JSON**  |  <pre>{<br />  "instance" : <instance>,<br />  "state": [ 9, <state>, true ],<br />  "Transformed" : "Yes"<br />}<br /></pre> |  <pre>{<br />  "instance" : "i-0123456789",<br />  "state": [<br />    9,<br />    "RUNNING",<br />    true<br />  ],<br />  "Transformed" : "Yes"<br />}</pre>  | 
|  **在 JSON 中包含保留变量**  |  <pre>{<br />  "instance" : <instance>,<br />  "state": <state>,<br />  "ruleArn" : <aws.events.rule-arn>,<br />  "ruleName" : <aws.events.rule-name>,<br />  "originalEvent" : <aws.events.event.json><br />}</pre> |  <pre>{<br />  "instance" : "i-0123456789",<br />  "state": "RUNNING",<br />  "ruleArn" : "arn:aws:events:us-east-2:123456789012:rule/example",<br />  "ruleName" : "example",<br />  "originalEvent" : {<br />    ... // commented for brevity<br />  }<br />}</pre>  | 
|  **在字符串中包含保留变量**  | <pre>"<aws.events.rule-name> triggered"</pre> |  <pre>"example triggered"</pre>  | 
|  **亚马逊 CloudWatch 日志组**  | <pre>{<br />  "timestamp" : <timestamp>,<br />  "message": "instance \"<instance>\" is in <state>"<br />}</pre> |  <pre>{<br />  "timestamp" : 2015-11-11T21:29:54Z,<br />  "message": "instance "i-0123456789" is in RUNNING<br />}</pre>  | 

## 使用 EventBridge API 转换输入
<a name="eb-transform-input-api"></a>

有关使用 EventBridge API 转换输入的信息，请参阅[使用输入转换器从事件中提取数据并将该数据输入到目标](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html#API_PutTargets_Example_2)。

## 使用转换输入 AWS CloudFormation
<a name="eb-transform-input-cfn"></a>

有关使用 AWS CloudFormation 转换输入的信息，请参见[AWS::Events::Rule InputTransformer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-inputtransformer.html)。

## 转换输入的常见问题
<a name="eb-transform-input-issues"></a>

以下是转换输入时的一些常见问题 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](https://docs.aws.amazon.com/inspector/latest/user/eventbridge-integration.html#event-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>"
  ```