Ir para o conteúdo

Como uso webhooks para publicar mensagens do Amazon SNS no Amazon Chime, Slack ou Microsoft Teams?

5 minuto de leitura
0

Quero enviar notificações de mensagens do Amazon Simple Notification Service (Amazon SNS) para o Amazon Chime, Slack ou Microsoft Teams.

Breve descrição

É possível usar o Amazon SNS para enviar mensagens de notificação para endpoints HTTP ou HTTPS, como URLs de webhook. No entanto, alguns webhooks esperam pares de chave/valor JSON que o Amazon SNS não aceita ao confirmar a assinatura HTTP ou HTTPS.

Por exemplo, os webhooks do Amazon Chime esperam uma solicitação JSON com uma string de mensagem correspondente a uma chave Content. Da mesma forma, os webhooks do Slack e do Microsoft Teams esperam uma solicitação JSON com uma string de mensagem correspondente a uma chave text.

Para transformar o documento JSON do corpo de uma mensagem do Amazon SNS para que o endpoint do webhook possa processar, use uma função do AWS Lambda.

Observação: para obter uma lista dos pares de valores-chave no documento JSON de um corpo de mensagem do Amazon SNS, consulte o formato JSON de confirmação de assinatura HTTP/HTTPS.

Resolução

Criar um tópico do SNS

Se ainda não fez isso, crie um tópico do SNS com um nome exclusivo.

Criar uma função do Lambda

Siga as instruções para criar uma função do Lambda. Seu código de função do Lambda deve incluir lógica para transformar as mensagens de notificação do tópico do SNS para o tipo de endpoint de webhook que você está usando.

Para ver exemplos, veja os seguintes trechos de código em Python para webhooks do Amazon Chime, Slack e Microsoft Teams.

Exemplo de trecho de código Python para o Amazon Chime

Os webhooks do Amazon Chime esperam uma solicitação JSON com uma string de mensagem correspondente a uma chave Content. Para obter mais informações, consulte Webhooks para o Amazon Chime.

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

Observação: substitua https://hooks.chime.aws/incomingwebhooks/xxxxxxx pelo URL do seu webhook.

Exemplo de trecho de código Python para o Slack

Os webhooks do Slack esperam uma solicitação JSON com uma string de mensagem que corresponda a uma chave texto. Eles também oferecem suporte à personalização de mensagens para adicionar um nome de usuário e um ícone ou substituir o canal padrão do webhook. Para obter mais informações, consulte Enviar mensagens usando webhooks de entrada no site do Slack.

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

Observação: substitua https://hooks.slack.com/services/xxxxxxx pelo URL do seu webhook e #CHANNEL_NAME pelo nome do canal de destino.

Exemplo de trecho de código Python para o Microsoft Teams

Os webhooks do Microsoft Teams esperam uma solicitação JSON com uma string de mensagem que corresponda a uma chave texto. Para obter mais informações, consulte Criar e enviar mensagens no site do 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,
        }
    )

Observação: substitua https://outlook.office.com/webhook/xxxxxxx pelo URL do seu webhook.

Testar a função do Lambda

Conclua as seguintes etapas:

  1. Na página Funções do console do Lambda, escolha sua função.
  2. Abra a guia Teste. Em Nome do evento, insira um nome.
  3. Escolha a lista suspensa Modelo e selecione Notificação de tópico do SNS.
  4. Escolha Salvar e, em seguida, escolha Testar.

Se a invocação do teste for bem-sucedida com um código de status 200, a mensagem de notificação do Amazon SNS foi aceita pelo seu webhook e entregue ao canal.

Se a invocação de teste falhar com um código de status 4xx, verifique se o par de valores/chave do URL do webhook está correto e se é aceito pelo webhook de destino.

Para obter mais informações, consulte Invocar a função do Lambda usando o editor de código do console.

Adicione um tópico do SNS e inscreva a função do Lambda nele

Conclua as seguintes etapas:

  1. Na página Funções do console do Lambda, escolha sua função.
  2. Em Visão geral da função, escolha Adicionar gatilho.
  3. Escolha a lista suspensa Configuração do gatilho e selecione SNS.
  4. Em Tópico do SNS, escolha o tópico do SNS que você criou anteriormente.
  5. Escolha Adicionar.
  6. Inscreva sua função do Lambda no tópico do SNS.

Com sua função inscrita no seu tópico do SNS, as mensagens publicadas no tópico são encaminhadas para a função e para o seu webhook.

Informações relacionadas

Como posso resolver o erro que recebo ao assinar uma função do Lambda em uma fonte de eventos baseada em push no CloudFormation?

Monitoramento de serviços da AWS usando o Amazon Q Developer em aplicações de bate-papo