如何建立使用輸入轉換器使得 Amazon SNS 通知人類可讀的 EventBridge 規則?

3 分的閱讀內容
0

我想要建立 Amazon EventBridge 規則,以啟動人類可讀的自訂 Amazon Simple Notification Service (Amazon SNS) 通知。

簡短說明

若要使得 Amazon SNS 事件通知人類可讀,請使用 EventBridge 中的輸入轉換器。輸入轉換器可在事件傳送到 EventBridge 規則的目標之前從事件自訂文字。如需完整的教學課程,請參閱教學課程: 使用輸入轉換器以自訂 EventBridge 傳遞至事件目標的內容。

例如,您可以將 SNS 主題設定為目標,以從輸入轉換器接收自訂事件文字。您還可以建立 EventBridge 規則,以符合 AWS CloudTrail 擷取的安全群組相關的 API 呼叫。規則使用符合相關 API 呼叫的事件模式進行設定。

下列解決方案包含兩個範例事件,您可用於建立自己的 EventBridge 規則,以使得 Amazon SNS 通知人類可讀。

解決方案

Amazon EC2 狀態變更的範例事件

下列範例會將 SNS 主題設定為從輸入轉換器接收自訂事件文字的目標。在此範例中,事件是 Amazon Elastic Compute Cloud (Amazon EC2) 狀態變更。

以下是以 JSON 格式發佈到 EventBridge 事件匯流排的範例事件:

{  
    "version": "0",  
    "id": "2ad63080-2526-d42c-4983-123456789",  
    "detail-type": "EC2 Instance State-change Notification",  
    "source": "aws.ec2",  
    "account": "0123456789",  
    "time": "2023-05-17T16:30:32Z",  
    "region": "us-east-1",  
    "resources": [  
        "arn:aws:ec2:us-east-1:0123456789:instance/i-12345abcdefg"  
    ],  
    "detail": {  
        "instance-id": "i-12345abcdefg",  
        "state": "running"  
    }  
}

輸入轉換器有兩個區段:

  • 輸入路徑: 您可以在其中定義使用 JSON 路徑來參考原始事件來源中值的變數。
  • **範本:**您想要傳遞給目標的資訊範本。

輸入路徑

若要建立輸入路徑,請參閱輸入轉換範例。對於此範例,請使用下列輸入路徑:

{  
"timestamp": "$.time",  
"instance": "$.detail.instance-id",  
"state": "$.detail.state"  
}

範例

對於此範例,請使用下列範本:

範例 1:

"Instance example-instance is in example-state state"

範例 2:

"At example-timestamp, Instance example-instance changed its state to example-state. "

前面的範例範本會以下列格式傳送訊息給目標:

範例 1:

"Instance i-12345abcdefg is in running state"

範例 2:

"At 2023-05-17T16:30:32Z, Instance i-12345abcdefg changed its state to running. "

設定 EventBridge 以使用輸入轉換器

若要設定 EventBridge 以傳送自訂訊息至 SNS 主題,請完成下列步驟:

**注意事項:**這些指示會遵循建立對事件反應的規則中的步驟。它們還會提供設定輸入轉換器的特定步驟。

1.    為 Amazon EC2 狀態變更事件定義 EventBridge 規則

2.    建置事件模式。在「建立方法區段」中,針對「方法」選擇「自訂模式 (JSON 編輯器)」。

3.    針對「事件模式」,輸入下列 Amazon EC2 狀態變更事件的範例 JSON:

{  
"source": ["aws.ec2"],  
"detail-type": ["EC2 Instance State-change Notification"]  
}

4.    選擇「下一步」。

5.    針對「目標類型」,選擇「AWS 服務」。

6.    針對「選取目標」,選擇「SNS 主題」。然後,從下拉式清單中選取您的主題。

7.    針對「其他設定」,在「設定目標輸入」下拉式清單中,選擇「輸入轉換器」。然後,選擇「設定輸入轉換器」。

8.    在「目標輸入轉換器」區段下,針對「輸入路徑」,複製並貼上下列 JSON:

{  
"timestamp": "$.time",  
"instance": "$.detail.instance-id",  
"state": "$.detail.state"  
}

9.    針對「輸入範本」,複製並貼上下列字串範本:

"Instance example-instance is in example-state state"  
"At example-timestamp, Instance example-instance changed its state to example-state. "

10.    選擇「確認」,然後選擇「下一步」。

11.    (選用) 將標籤新增至規則,然後選擇「下一步」。

12.    檢閱規則的詳細資料,然後選擇「建立規則」。

Amazon EC2 安全群組 API 呼叫的範例事件

在下列範例事件中,使用虛擬私有雲端 (VPC) 中的 CreateSecurityGroup 來建立安全群組。AWS CloudTrail 會擷取事件,並以下列 JSON 格式發佈至 Amazon CloudWatch:

{
    "version": "0",
    "id": "41dff147-cfbc-492a-9a98-9dd00d082417",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.ec2",
    "account": "123456789012",
    "time": "2017-07-14T16:36:23Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.05",
        "userIdentity": {
            "type": "Root",
            "principalId": "123456789012",
            "arn": "arn:aws:iam::123456789012:root",
            "accountId": "123456789012",
            "accessKeyId": "ASIAIRP4G1234567891Q",
            "userName": "iamuser",
            "sessionContext": {
                "attributes": {
                    "mfaAuthenticated": "false",
                    "creationDate": "2017-07-14T16:27:38Z"
                }
            }
        },
        "eventTime": "2017-07-14T16:36:23Z",
        "eventSource": "ec2.amazonaws.com",
        "eventName": "CreateSecurityGroup",
        "awsRegion": "us-east-1",
        "sourceIPAddress": "72.21.196.64",
        "userAgent": "console.ec2.amazonaws.com",
        "requestParameters": {
            "groupName": "test",
            "groupDescription": "test",
            "vpcId": "vpc-54a4232d"
        },
        "responseElements": {
            "_return": true,
            "groupId": "sg-82d531f3"
        },
        "requestID": "a4609e55-69ac-4a2d-8057-843dc8b4658b",
        "eventID": "7774b898-59c1-48a5-9c41-af1bcaa04612",
        "eventType": "AwsApiCall"
    }
}

如何建立自訂人類可讀通知的範例

使用下列範例,從 EventBridge 以 JSON 格式建立自訂人類可讀的通知。

1.    為安全群組相關的 API 呼叫「建立 EventBridge 規則」。針對「事件模式」,選擇「建置自訂事件模式」。針對您的使用案例修改範例事件模式。請注意,範例通知適用於 CreateSecurityGroup。但是,下列範例事件模式包含所有與安全群組相關的 API 呼叫動作:

{
  "source": [
    "aws.ec2"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "ec2.amazonaws.com"
    ],
    "eventName": [
      "CreateSecurityGroup",
      "AuthorizeSecurityGroupEgress",
      "AuthorizeSecurityGroupIngress",
      "DeleteSecurityGroup",
      "RevokeSecurityGroupEgress",
      "RevokeSecurityGroupIngress",
      "DescribeStaleSecurityGroups",
      "DescribeSecurityGroups",
      "DescribeSecurityGroupReferences"
    ]
  }
}

2.    針對「目標類型」,選擇「AWS 服務」。

3.    針對「選取目標」,選擇「SNS 主題」。然後,從下拉式清單中選取您的主題。

4.    針對「其他設定」,在「設定目標輸入」下拉式清單中,選擇「輸入轉換器」。然後,選擇「設定輸入轉換器」。

5.    在「目標輸入轉換器」區段下,針對「輸入路徑」,貼上下列 JSON。在通知中包含您想要使用的任何金鑰組。針對您的使用案例修改下列範例輸入路徑:

{  
    "sgname": "$.detail.requestParameters.groupName",  
    "sourceip": "$.detail.sourceIPAddress",  
    "vpcid": "$.detail.requestParameters.vpcId",  
    "action": "$.detail.eventName",  
    "sgid": "$.detail.responseElements.groupId",  
    "time": "$.detail.eventTime",  
    "region": "$.detail.awsRegion",  
    "user": "$.detail.userIdentity.userName",  
    "reqid": "$.detail.requestID"  
}

6.    針對「輸入範本」,貼上下列字串範本。為輸入路徑中的值包含預留位置的字串。此字串是通知的人類可讀文字。針對您的使用案例修改下列範例輸入範本:

"User example-user  has executed API call example-action from source IP example-sourceip on security group example-sgid/example-sgname that belongs to vpc example-vpcid in region example-region at time(UTC) example-time. The Request ID is example-reqid."

7.    選擇「確認」,然後選擇「下一步」。

8.    (選用) 將標籤新增至規則,然後選擇「下一步」。

9.    檢閱規則的詳細資料,然後選擇「建立規則」。

疑難排解

如果您在儲存包含換行的範本時收到「輸入範本無效」錯誤,請用雙引號括住每一行。請參閱下列範例:

"example-type example-arn has executed action API example-action on Security Group example-sgid located in AWS region example-region at example-time (UTC)."
"Event Details:"
"Request ID: example-requestid"
"Event ID: example-eventid"
"Event Source: example-eventsource"
"Event Type: example-eventtype"

如果您的規則可以執行但無法調用目標,則為 EventBridge 設定無效字母佇列以接收與輸入轉換器相關的錯誤。

EventBridge 在輸入路徑對應中最多可支援 100 個變數。若要擷取超過 10 個變數,請將整個事件傳遞給 AWS Lambda 函數。編寫此函數來剖析變數,並以必要格式構建用於發佈的訊息內文。然後,以必要格式建構訊息內文以發佈至 Amazon SNS。如需詳細資訊,請參閱如何使用 Lambda 函數將訊息發佈至 Amazon SNS 主題?

AWS 官方
AWS 官方已更新 6 個月前