Amazon EventBridge 輸入轉換 - Amazon EventBridge

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

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

輸入範本是您要傳遞到目標的資訊範本。您可以建立一個將字串或 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"

Amazon 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 路徑,則該變數不會建立,且不會出現在輸出中。

  • 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 尋找」事件與下列事件模式進行比對:

    { "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>"