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

6 minuto de leitura
0

Quero usar webhooks para conectar meu ambiente da AWS à minha sala de chat do Amazon Chime ou ao meu canal do Slack ou do Microsoft Teams. Como faço para enviar notificações do Amazon Simple Notification Service (Amazon SNS) para um webhook?

Breve descrição

Você pode 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 da mensagem do Amazon SNS a ser processado pelo endpoint do webhook, use uma função do AWS Lambda.

Observação: para obter uma lista de pares de chave/valor no documento JSON do corpo da mensagem do Amazon SNS, consulte o formato JSON de notificação HTTP e 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

Para obter instruções sobre como criar uma função do Lambda, consulte Conceitos básicos sobre o AWS Lambda. Para obter mais informações, consulte Usar o AWS Lambda com o Amazon SNS.

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. Esses exemplos de código são fornecidos no estado em que se encontram. São compatíveis com o runtime Python 3.7 .

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.

Observação: neste exemplo de código de função para webhooks do Amazon Chime, substitua https://hooks.chime.aws/incomingwebhooks/xxxxxxx pelo URL do webhook.

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

Exemplo de trecho de código Python para o Slack

Webhooks de entrada do Slack esperam uma solicitação JSON com uma string de mensagem correspondente a uma chave "text". Eles também oferecem suporte à personalização de mensagens, como 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.

Observação: neste exemplo de código de função para webhooks de entrada do Slack, substitua https://hooks.slack.com/services/xxxxxxx pelo URL do webhook de entrada. Também substitua #CHANNEL_NAME pelo nome do canal de destino.

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

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

Webhooks de entrada do Microsoft Teams também esperam uma solicitação JSON com uma string de mensagem correspondente a uma chave "text". Para obter mais informações, consulte Criar e enviar mensagens no site do Microsoft Docs.

Observação: neste exemplo de código de função para webhooks de entrada do Microsoft Teams, substitua https://outlook.office.com/webhook/xxxxxxx pelo URL do webhook.

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

Testar a função do Lambda

  1. Na página Funções do console do Lambda, escolha sua função.
  2. Escolha a lista suspensa Teste. Em seguida, escolha Configurar evento de teste.
  3. Na caixa de diálogo Configurar evento de teste, escolha Criar novo evento.
  4. Em Modelo de evento, escolha Notificação de tópico do SNS.
  5. Em Nome do evento, insira um nome para o evento de teste.
  6. Escolha Salvar.
  7. Depois de salvá-lo, escolha Testar. Em seguida, revise o Resultado da execução.
  • 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, que a entregará ao canal correspondente.
  • Se a invocação falhar com um código de status 4xx:
    Verifique o URL do webhook para confirmar se o par de chave/valor está correto e foi aceito pelo webhook de destino.

Para obter mais informações sobre como testar funções no console do Lambda, consulte Invocar a função do Lambda.

Adicionar um gatilho de tópico do SNS à sua função do Lambda

Depois de enviar uma mensagem do SNS ao seu webhook como teste no console do Lambda, inscreva sua função no tópico do SNS. Para configurar isso no console do Lambda, adicione um gatilho de tópico do SNS:

  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. Para obter mais informações, consulte Invocar funções do Lambda.
  3. Em Configuração do gatilho, escolha Selecionar um gatilho. Em seguida, escolha SNS.
  4. Em Tópico do SNS, escolha o tópico do SNS que você criou anteriormente.
  5. Escolha Adicionar.

Para obter mais informações, consulte Configurar funções (console).

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, em seguida, para seu webhook.

Observação: para obter informações sobre como receber notificações do Amazon SNS por meio de outros serviços da AWS, consulte Monitorar serviços da AWS usando o AWS Chatbot.


Informações relacionadas

Adicionar webhooks a salas de chat

Entrega de mensagem bruta

Como assinar uma função do Lambda para um tópico do Amazon SNS na mesma conta?

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

AWS OFICIAL
AWS OFICIALAtualizada há um ano