如何使用 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 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 函数

完成以下步骤:

  1. 在 Lambda 控制台的函数页面上,选择您的函数。
  2. 打开 Test(测试)选项卡。在 Event name(事件名称)中,输入名称。
  3. 选择 Template(模板)下拉列表,然后选择 SNS Topic Notification(SNS 主题通知)。
  4. 选择 Save(保存),然后选择 Test(测试)。

如果测试调用成功且状态代码为 200,则您的 Webhook 接受了 Amazon SNS 通知消息并已发送到该通道。

如果测试调用失败并显示 4xx 状态代码,请验证 Webhook URL 键值对是否正确并被目标 Webhook 接受。

有关详细信息,请参阅使用控制台代码编辑器调用 Lambda 函数

添加 SNS 主题并订阅 Lambda 函数

完成以下步骤:

  1. 在 Lambda 控制台的函数页面上,选择您的函数。
  2. Function overview(函数概述)下,选择 Add trigger(添加触发器)。
  3. 选择 Trigger configuration(触发器配置)下拉列表,然后选择 SNS
  4. 对于 SNS topic(SNS 主题),选择您之前创建的 SNS 主题。
  5. 选择 Add(添加)。
  6. 将您的 Lambda 函数订阅到 SNS 主题

现在您已将您的函数订阅到 SNS 主题,发布到主题的消息将转发至该函数和您的 Webhook。

相关信息

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

Monitoring AWS services using Amazon Q Developer in chat applications