如何使用 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 订阅时收到 Amazon SNS 不支持的 JSON 键值对。

例如,Amazon Chime Webhook 希望收到其中包含对应于**“Content”键的消息字符串的 JSON 请求。同样,Slack 和 Microsoft Teams 的 Webhook 都希望收到其中包含对应于“text”**键的消息字符串的 JSON 请求。

如需转换 Amazon SNS 消息正文 JSON 文档供 Webhook 端点处理,请使用 AWS Lambda 函数

**注意:**有关 Amazon SNS 消息正文 JSON 文档中的键值对列表,请参阅 HTTP and HTTPS notification JSON format

解决方法

创建 SNS 主题

如果您还没有这样做,请创建一个具有唯一名称的 SNS 主题

创建 Lambda 函数

有关创建 Lambda 函数的说明,请参阅 Getting Started with AWS Lambda。有关更多信息,请参阅 Using AWS Lambda with Amazon SNS

您的 Lambda 函数代码必须包含根据您使用的 Webhook 端点类型转换您的 SNS 主题通知消息的逻辑。有关示例,请参阅 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 网站上的 Sending messages using incoming webhooks

**注意:**在 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 Docs 网站上的 Create and send messages

**注意:**在 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:
    您的 Webhook 会接受 Amazon SNS 通知消息,并将其传送到相应频道。
  • 如果调用失败,且状态码为 4xx:
    验证 Webhook URL 以确认键值对正确并被目标 Webhook 接受。

有关在 Lambda 控制台中测试函数的更多信息,请参阅 Invoke the Lambda function

向您的 Lambda 函数添加 SNS 主题触发器

在 Lambda 控制台中将 SNS 消息作为测试成功发送到 Webhook 之后,将您的函数订阅到 SNS 主题。要从 Lambda 控制台进行配置,请添加 SNS 主题触发器:

  1. 在 Lambda 控制台的函数页面上,选择您的函数。
  2. 函数概述下,选择添加触发器。有关更多信息,请参阅 Invoking Lambda functions
  3. 触发器配置下,选择**选择触发器。**然后,选择 SNS
  4. 对于 SNS 主题,选择您之前创建的 SNS 主题。
  5. 选择添加

有关更多信息,请参阅 Configuring functions (console)

通过将您的函数订阅到 SNS 主题,将发布到主题的消息转发至该函数,然后再转发至您的 Webhook。

**注意:**有关如何通过其他 AWS 服务获取 Amazon SNS 通知的信息,请参阅 Monitoring AWS Services using AWS Chatbot


相关信息

Adding webhooks to chat rooms

原始消息传输

如何在同一账户中将 Lambda 函数订阅到 Amazon SNS 主题?

如何解决将 AWS Lambda 函数订阅到 AWS CloudFormation 中基于推送的事件源时收到的错误?

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