跳至內容

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

3 分的閱讀內容
0

我想要將通知從 Amazon Simple Notification Service (Amazon SNS) 訊息傳送到 Amazon Chime、Slack 或 Microsoft Teams。

簡短描述

您可以使用 Amazon SNS 將通知訊息傳送至 HTTP 或 HTTPS 端點,例如 Webhook 網址。但是,某些 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 函式。您的 Lambda 函式程式碼必須包含邏輯,用來將 SNS 主題的通知訊息轉換為您所使用的 Webhook 端點所需的格式。

如需範例,請參閱下列用於 Amazon Chime、Slack 和 Microsoft Teams Webhook 的 Python 程式碼片段。

Amazon Chime 的 Python 程式碼片段範例

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

import urllib3import 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,
        }
    )

**注意:**將 https://hooks.chime.aws/incomingwebhooks/xxxxxxx 替換為您的 Webhook 網址。

Slack 的 Python 程式碼片段範例

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

import urllib3import 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,
        }
    )

**注意:**將 https://hooks.slack.com/services/xxxxxxx 替換為您的 Webhook 網址,並將 #CHANNEL_NAME 替換為目標頻道的名稱。

Microsoft Teams 的 Python 程式碼片段範例

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

import urllib3import 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,
        }
    )

**注意:**將 https://outlook.office.com/webhook/xxxxxxx 替換為您的 Webhook 網址。

測試 Lambda 函式

請完成下列步驟:

  1. 在 Lambda 主控台的 Functions page (函式) 頁面上,選擇您的函式。
  2. 開啟 Test (測試) 索引標籤。在 Event name (事件名稱) 中,輸入名稱。
  3. 選擇 Template (範本) 下拉式清單,然後選取 SNS Topic Notification (SNS 主題通知)。
  4. 選擇 Save (儲存),然後選擇 Test (測試)。

如果測試調用成功並傳回 200 狀態代碼,表示 Amazon SNS 通知訊息已由您的 Webhook 接受並傳送到頻道。

如果測試調用失敗並顯示 4xx 狀態代碼,請確認 Webhook URL 索引鍵/值組是否正確並由目標 Webhook 接受。

如需詳細資訊,請參閱使用主控台程式碼編輯器調用 Lambda 函式

新增 SNS 主題並將 Lambda 函式訂閱至該主題

請完成下列步驟:

  1. 在 Lambda 主控台的 Functions page (函式) 頁面上,選擇您的函式。
  2. Function overview (函式概觀) 下,選擇 Add trigger (新增觸發程序)。
  3. Trigger configuration (觸發程序組態) 下拉式清單中,然後選取 SNS
  4. SNS topic (SNS 主題) 中,選擇您之前建立的 SNS 主題。
  5. 選擇 Add (新增)。
  6. 將您的 Lambda 函式訂閱到 SNS 主題

現在您已將函式訂閱到 SNS 主題,發佈至主題的訊息將轉送至該函式和您的 Webhook。

相關資訊

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

在聊天應用程式中使用 Amazon Q Developer 監控 AWS 服務