Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何使用 Webhook 将 Amazon SNS 消息发布到 Amazon Chime、Slack 或 Microsoft Teams?
我想通过 Amazon Simple Notification Service (Amazon SNS) 消息向 Amazon Chime、Slack 或 Microsoft Teams 发送通知。
简短描述
您可以使用 Amazon SNS 向 HTTP 或 HTTPS 端点发送通知消息,例如 Webhook URL。然而,有些 Webhook 希望在确认 HTTP 或 HTTPS 订阅时收到 Amazon SNS 不支持的 JSON 键值对。
例如,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 函数代码必须包含根据您使用的 Webhook 端点类型转换您的 SNS 主题通知消息的逻辑。
有关示例,请参阅 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 URL。
Slack 的 Python 代码片段示例
Slack Webhook 希望收到其中包含对应于 text 键的消息字符串的 JSON 请求。它们还支持消息自定义以添加用户名和图标,或覆盖 Webhook 的默认通道。有关详细信息,请参阅 Slack 网站上的 Sending messages using incoming webhooks。
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 URL,将 #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 URL。
测试 Lambda 函数
完成以下步骤:
- 在 Lambda 控制台的函数页面上,选择您的函数。
- 打开 Test(测试)选项卡。在 Event name(事件名称)中,输入名称。
- 选择 Template(模板)下拉列表,然后选择 SNS Topic Notification(SNS 主题通知)。
- 选择 Save(保存),然后选择 Test(测试)。
如果测试调用成功且状态代码为 200,则您的 Webhook 接受了 Amazon SNS 通知消息并已发送到该通道。
如果测试调用失败并显示 4xx 状态代码,请验证 Webhook URL 键值对是否正确并被目标 Webhook 接受。
有关详细信息,请参阅使用控制台代码编辑器调用 Lambda 函数。
添加 SNS 主题并订阅 Lambda 函数
完成以下步骤:
- 在 Lambda 控制台的函数页面上,选择您的函数。
- 在 Function overview(函数概述)下,选择 Add trigger(添加触发器)。
- 选择 Trigger configuration(触发器配置)下拉列表,然后选择 SNS。
- 对于 SNS topic(SNS 主题),选择您之前创建的 SNS 主题。
- 选择 Add(添加)。
- 将您的 Lambda 函数订阅到 SNS 主题。
现在您已将您的函数订阅到 SNS 主题,发布到主题的消息将转发至该函数和您的 Webhook。
相关信息
如何解决将 Lambda 函数订阅到 CloudFormation 中基于推送的事件源时收到的错误?
Monitoring AWS services using Amazon Q Developer in chat applications
