如何使用 Webhook 將 Amazon SNS 訊息發佈至 Amazon Chime、Slack 或 Microsoft Teams?
我想使用 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 的這個範例函數程式碼中,請將 取代為 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 的這個範例函數程式碼中,將 取代為傳入 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 的這個範例函數程式碼中,將 取代為 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 函數
- 在 Lambda 主控台的「函數」頁面上,選擇您的函數。
- 選擇測試下拉式清單。然後,選擇設定測試事件。
- 在設定測試事件對話方塊中,選擇建立新事件。
- 對於事件範本,選擇 SNS 主題通知。
- 對於事件名稱,輸入測試事件的名稱。
- 選擇儲存。
- 儲存完成後,選擇測試。然後,檢閱執行結果。
如果測試調用成功,狀態代碼為 200:
Amazon SNS 通知訊息會被您的 Webhook 接受,並將其傳送至相應的通道。
如果調用失敗,狀態代碼為 4xx:
驗證 Webhook URL,以確認鍵值對正確且已被目的地 Webhook 接受。
如需有關 Lambda 主控台中測試函數的詳細資訊,請參閱使用主控台調用 Lambda 函數。
將 SNS 主題觸發器新增至 Lambda 函數
在 Lambda 主控台中將 SNS 訊息作為測試傳送至 Webhook 之後,請將您的函數訂閱至您的 SNS 主題。若要從 Lambda 主控台設定此項目,請新增 SNS 主題觸發器:
- 在 Lambda 主控台的「函數」頁面上,選擇您的函數。
- 在 Function overview (函數概觀) 下,選擇 Add trigger (新增觸發器)。如需詳細資訊,請參閱使用主控台調用 Lambda 函數。
- 在 Trigger configuration (觸發器組態) 下,選擇**Select a trigger (選取觸發器)。**然後,選擇 SNS。
- 對於 SNS 主題,選擇您之前建立的 SNS 主題。
- 選擇新增。
如需詳細資訊,請參閱設定函數 (主控台)。
當您的函數訂閱至 SNS 主題後,發佈至主題的訊息將轉送至該函數,然後轉送至您的 Webhook 。
**注意:**如需如何透過其他 AWS 服務取得 Amazon SNS 通知的資訊,請參閱使用 AWS Chatbot 監控 AWS 服務。
相關資訊
相關內容
- 已提問 4 個月前lg...
- 已提問 5 個月前lg...
- 已提問 3 個月前lg...
- 已提問 2 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 個月前