如何使用 Webhook 將 Amazon SNS 訊息發佈至 Amazon Chime、Slack 或 Microsoft Teams?

3 分的閱讀內容
0

我想使用 Webhook 將 AWS 環境連線至我的 Amazon Chime 聊天室,或連線至我的 Slack 或 Microsoft Teams 通道。如何將通知從 Amazon Simple Notification Service (Amazon SNS) 傳送至 Webhook ?

簡短描述

您可以使用 Amazon SNS 將通知訊息傳送至 HTTP 或 HTTPS 端點,例如 Webhook URL。但是,某些 Webhook 預期在確認 HTTP 或 HTTPS 訂閱時收到 JSON 鍵值對,而 Amazon SNS 不支援這一點。

例如,Amazon Chime Webhook 預期收到包含與 "Content" 鍵對應之訊息字串的 JSON 請求。同樣地,Slack 和 Microsoft Teams Webhook 都預期收到包含與 "text" 鍵對應之訊息字串的 JSON 請求。

若要將 Amazon SNS 訊息內文 JSON 文件轉換為要處理的 Webhook 端點,請使用 AWS Lambda 函數

**注意:**如需 Amazon SNS 訊息內文 JSON 文件中鍵值對的清單,請參閱 HTTP 和 HTTPS 通知 JSON 格式

解決方法

建立 SNS 主題

如果尚未使用唯一名稱建立 SNS 主題,請加以建立。

建立 Lambda 函數

如需建立 Lambda 函數的指示,請參閱 AWS Lambda 入門。如需詳細資訊,請參閱將 AWS Lambda 與 Amazon SNS 搭配使用

您的 Lambda 函數程式碼必須包含用於轉換 SNS 主題的通知訊息的邏輯,以符合您所使用 Webhook 端點的類型。如需範例,請參閱下列用於 Amazon Chime、Slack 和 Microsoft Teams Webhook 的 Python 程式碼片段。這些程式碼範例依原狀提供。它們相容於 Python 3.7 執行時期

Amazon Chime 的 Python 程式碼片段範例

Amazon Chime Webhook 預期收到包含與 "Content" 鍵對應之訊息字串的 JSON 請求。如需詳細資訊,請參閱 Amazon Chime 的 Webhook

**注意:**在 Amazon Chime Webhook 的這個範例函數程式碼中,請將 https://hooks.chime.aws/incomingwebhooks/xxxxxxx 取代為 Webhook URL。

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://hooks.chime.aws/incomingwebhooks/xxxxxxx"
    msg = {"Content": event["Records"][0]["Sns"]["Message"]}
    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

Slack 的 Python 程式碼片段範例

Slack 傳入 Webhook 預期收到包含與 "text" 鍵對應之訊息字串的 JSON 請求。它們還支援訊息自訂,例如新增使用者名稱和圖示,或覆寫 Webhook 的預設通道。如需詳細資訊,請參閱 Slack 網站上的使用傳入 Webhook 傳送訊息

**注意:**在 Slack 傳入 Webhook 的這個範例函數程式碼中,將 https://hooks.slack.com/services/xxxxxxx 取代為傳入 Webhook URL。另請將 #CHANNEL_NAME 取代為目標通道的名稱。

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://hooks.slack.com/services/xxxxxxx"
    msg = {
        "channel": "#CHANNEL_NAME",
        "username": "WEBHOOK_USERNAME",
        "text": event["Records"][0]["Sns"]["Message"],
        "icon_emoji": "",
    }

    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

Microsoft Teams 的 Python 程式碼片段範例

Microsoft Teams 傳入 Webhook 也預期收到包含與 "text" 鍵對應之訊息字串的 JSON 請求。如需詳細資訊,請參閱 Microsoft 文件網站上的建立和傳送訊息

**注意:**在 Microsoft Teams 傳入 Webhook 的這個範例函數程式碼中,將 https://outlook.office.com/webhook/xxxxxxx 取代為 Webhook URL。

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://outlook.office.com/webhook/xxxxxxx"
    msg = {"text": event["Records"][0]["Sns"]["Message"]}
    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

測試 Lambda 函數

  1. 在 Lambda 主控台的「函數」頁面上,選擇您的函數。
  2. 選擇測試下拉式清單。然後,選擇設定測試事件
  3. 設定測試事件對話方塊中,選擇建立新事件
  4. 對於事件範本,選擇 SNS 主題通知
  5. 對於事件名稱,輸入測試事件的名稱。
  6. 選擇儲存
  7. 儲存完成後,選擇測試。然後,檢閱執行結果
  • 如果測試調用成功,狀態代碼為 200:
    Amazon SNS 通知訊息會被您的 Webhook 接受,並將其傳送至相應的通道。
  • 如果調用失敗,狀態代碼為 4xx:
    驗證 Webhook URL,以確認鍵值對正確且已被目的地 Webhook 接受。

如需有關 Lambda 主控台中測試函數的詳細資訊,請參閱調用 Lambda 函數

將 SNS 主題觸發器新增至 Lambda 函數

在 Lambda 主控台中將 SNS 訊息作為測試傳送至 Webhook 之後,請將您的函數訂閱至您的 SNS 主題。若要從 Lambda 主控台設定此項目,請新增 SNS 主題觸發器:

  1. 在 Lambda 主控台的「函數」頁面上,選擇您的函數。
  2. 函數概觀下,選擇新增觸發器。如需詳細資訊,請參閱調用 Lambda 函數
  3. 觸發器組態 下,選擇**選取觸發器。**然後,選擇 SNS
  4. 對於 SNS 主題,選擇您之前建立的 SNS 主題。
  5. 選擇新增

如需詳細資訊,請參閱設定函數 (主控台)

當您的函數訂閱至 SNS 主題後,發佈至主題的訊息將轉送至該函數,然後轉送至您的 Webhook 。

**注意:**如需如何透過其他 AWS 服務取得 Amazon SNS 通知的資訊,請參閱使用 AWS Chatbot 監控 AWS 服務


相關資訊

將 Webhook 新增至聊天室

原始訊息交付

如何將 Lambda 函數訂閱至同一個帳戶中的 Amazon SNS 主題?

如何解決在 AWS CloudFormation 中將 Lambda 函數訂閱至推送型事件來源時收到的錯誤?

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