如何為 EventBridge 規則建立自訂事件模式?

3 分的閱讀內容
0

我想使用 Amazon EventBridge 規則擷取 AWS 服務的某些事件。但是,我無法建立與事件相符的自訂事件模式。如何建立自訂的 EventBridge 事件模式?

解析度

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

EventBridge 接受來自 AWS 服務、EventBridge 合作夥伴和自訂事件的事件。本文討論源自 AWS 服務的 JSON 事件。您可以使用事件模式建立 EventBridge 規則,以篩選傳入的事件。如此一來,EventBridge 規則只會比對所需的事件,並將這些事件轉寄至目標。

確定傳入事件的 JSON 格式

有三種方法可確定傳入事件的 JSON 格式:

  1. 開啟 EventBridge 主控台
  2. 從導覽窗格的 Developer resources (開發人員資源) 下,選取 Sandbox (沙盒)。
  3. 捲動至 Sample event (範例事件) 區段,然後選取 AWS events (AWS 事件)。
  4. Sample events (範例事件) 功能表中,選取 EC2 Instance State-change Notification (EC2 執行個體狀態變更通知)。這會將第一個範例事件填入視窗中。對於指定的事件類型,可能有多個範例可用。
  • 使用與特定 AWS 服務的所有事件相符的簡單事件模式建立 EventBridge 規則。例如,此事件模式與所有 Amazon Elastic Compute Cloud (Amazon EC2) 事件相符:
{
 "source": [ "aws.ec2" ]
}

**注意:**事件模式中不允許使用萬用字元和空白事件。

接下來,將 SNSCloudWatch Log Group (CloudWatch 日誌群組) 目標與擷取傳入事件的規則建立關聯。目標必須將 Configure target input (設定目標輸入) 選項設定為 Matched events (相符事件),才能正確接收服務發出的 JSON。

以與傳入事件相同的 JSON 格式建立事件模式

以下規則適用於建立有效的相符事件模式:

  • 您未在事件模式中指定的所有欄位皆會自動比對。例如,如果事件模式中未指定 Detail (詳細資訊),則事件模式會將每個事件與任何詳細資訊比對。
  • 若要比對 JSON 結構中下一級的欄位,請使用大括號 { }。如果您在檢視較大的事件結構,JSON 檢視器可能會有所幫助。
  • 要從 JSON 事件比對的字串必須放在方括號 [] 中。您可以在方括號中包含多個值,以便在傳入事件中存在任一值時叫用事件。例如,若要根據 Amazon EC2 或 Amazon DynamoDB 傳送的每個事件叫用事件,請使用以下篩選條件:
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

步驟 1:使用 SNS / CloudWatch 目標取得傳入事件

此範例顯示發出至 EventBridge 的 Route 53 事件。ChangeResourceRecordSets (變更資源記錄集) API 呼叫代表在 Amazon Route 53 託管區域中建立 A 記錄。Amazon Simple Notification Service (Amazon SNS) 主題或 Amazon CloudWatch 日誌群組目標會擷取下列事件:

{
  "version": "0",
  "id": "d857ae5c-cc83-3742-ab88-d825311ee4e9",
  "detail-type": "AWS API Call via CloudTrail",
  "source": "aws.route53",
  "account": "123456789012",
  "time": "2019-12-05T16:50:53Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "1.05",
    "userIdentity": {
      "type": "AssumedRole",
      "principalId": "AROAABCDEFGHIJKLMNOPQ:Admin",
      "arn": "arn:aws:sts::123456789012:assumed-role/Admin",
      "accountId": "123456789012",
      "accessKeyId": "ASIAABCDEFGH12345678",
      "sessionContext": {
        "sessionIssuer": {
          "type": "Role",
          "principalId": "AROAABCDEFGHIJKLMNOPQ",
          "arn": "arn:aws:iam::123456789012:role/Admin",
          "accountId": "123456789012",
          "userName": "Admin"
        },
        "webIdFederationData": {},
        "attributes": {
          "mfaAuthenticated": "false",
          "creationDate": "2019-12-05T16:28:27Z"
        }
      }
    },
    "eventTime": "2019-12-05T16:50:53Z",
    "eventSource": "route53.amazonaws.com",
    "eventName": "ChangeResourceRecordSets",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "12.34.56.78",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
      "hostedZoneId": "Z1RP12345WXRQD",
      "changeBatch": {
        "changes": [
          {
            "action": "CREATE",
            "resourceRecordSet": {
              "type": "A",
              "tTL": 300,
              "resourceRecords": [
                {
                  "value": "4.4.4.4"
                }
              ],
              "name": "test.example.us."
            }
          }
        ]
      }
    },
    "responseElements": {
      "changeInfo": {
        "status": "PENDING",
        "id": "/change/C271P4WIKN511J",
        "submittedAt": "Dec 5, 2019 4:50:53 PM"
      }
    },
    "additionalEventData": {
      "Note": "Do not use to reconstruct hosted zone"
    },
    "requestID": "bbbf9847-96cb-45ef-b617-d535b9fe83d8",
    "eventID": "74e2d2c8-7497-4292-94d0-348272dbc4f7",
    "eventType": "AwsApiCall",
    "apiVersion": "2013-04-01"
  }
}

第 2 步:建立相應的 EventPattern (事件模式)

此範例事件模式會篩選多個欄位。例如,eventName (事件名稱)、hostedZoneld (主機名稱)、action (動作) 和 type (類型)。匹配的事件必須包含所有欄位和相應的值。此模式會隔離針對特定託管區域建立的 A 記錄。

{
  "source": [
    "aws.route53"
  ],
  "detail": {
    "eventSource": [
      "route53.amazonaws.com"
    ],
    "eventName": [
      "ChangeResourceRecordSets"
    ],
    "requestParameters": {
      "hostedZoneId": [
        "Z1RP12345WXRQD"
      ],
      "changeBatch": {
        "changes": {
          "action": [
            "CREATE"
          ],
          "resourceRecordSet": {
            "type": [
              "A"
            ]
          }
        }
      }
    }
  }
}

測試事件模式

使用 EventBridge 主控台進行測試

利用 EventBridge 沙盒: 

  1. Sample event (範例事件) 區段中,選取或輸入範例事件。
  2. Event pattern (事件模式) 區段下,提供事件模式。您可以透過使用事件模式表單中的功能表建立事件模式,或者透過使用自訂模式 (JSON 編輯器) 輸入自訂事件模式來執行此操作。
  3. 填入兩個區段之後,請選取 Test pattern (測試模式)以確認事件模式是否符合指定的範例事件。

使用 AWS CLI 進行測試

在 AWS CLI 中,執行 test-event-pattern 命令。若要確認事件模式相符,請確定結果為。透過執行此操作,您可以識別 AWS 服務傳送的 JSON 事件,並有助於您的自訂事件模式擷取特定事件。


相關資訊

Amazon EventBridge 事件模式

建立回應事件的 Amazon EventBridge 規則

教學:使用 EventBridge 記錄 AWS API 呼叫

Amazon EventBridge – CloudWatch Events 與 EventBridge 之間有什麼差別?(影片)

AWS 官方
AWS 官方已更新 2 年前