

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon 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`：EventBridge 規則的 Amazon Resource Name (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 欄位的值，因為它的內容不會逸出。

## 輸入轉換範例
<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>`。您可以在建立*輸入範本*時參考這些變數。

**注意**  
Amazon CloudWatch Logs 和 SSM 目標不支援在其輸入轉換器`InputPath`中使用 `Input`和 。

### 輸入範本
<a name="eb-transform-target-input-template"></a>

*輸入範本*是您要傳遞到目標的資訊範本。您可以建立一個將字串或 JSON 傳遞給目標的範本。使用先前的事件和*輸入路徑*，下列*輸入範本*範例會在將事件路由至目標之前，將事件轉換為範例輸出。


| Description | 範本 | 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>  | 
|  **Amazon 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>”會導致 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 問題清單](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>"
  ```