¿Cómo puedo utilizar los webhooks para publicar mensajes de Amazon SNS en Amazon Chime, Slack o Microsoft Teams?

6 minutos de lectura
0

Quiero usar webhooks para conectar mi entorno de AWS a mi sala de chat de Amazon Chime o a mi canal de Slack o Microsoft Teams. ¿Cómo puedo enviar notificaciones desde Amazon Simple Notification Service (Amazon SNS) a un webhook?

Breve descripción

Puede usar Amazon SNS para enviar mensajes de notificación a puntos de enlace HTTP o HTTPS, como las URL de webhooks. Sin embargo, algunos webhooks esperan pares clave-valor JSON que Amazon SNS no admite al confirmar la suscripción HTTP o HTTPS.

Por ejemplo, los webhooks de Amazon Chime esperan una solicitud JSON con una cadena de mensaje correspondiente a una clave de contenido. Por su parte, los webhooks de Slack y Microsoft Teams esperan una solicitud JSON con una cadena de mensaje correspondiente a una clave de texto.

Para transformar el documento JSON del cuerpo del mensaje de Amazon SNS para que lo procese el punto de enlace del webhook, utilice una función de AWS Lambda.

Nota: Para obtener una lista de los pares clave-valor del documento JSON del cuerpo del mensaje de Amazon SNS, consulte HTTP and HTTPS notification JSON format.

Solución

Creación de un tema de SNS

Si aún no lo ha hecho, cree un tema de SNS con un nombre único.

Creación de una función de Lambda

Para obtener instrucciones para crear una función de Lambda, consulte Getting Started with AWS Lambda. Para obtener más información, consulte Using AWS Lambda with Amazon SNS.

El código de función de Lambda debe incluir la lógica para transformar los mensajes de notificación del tema de SNS para el tipo de punto de enlace del webhook que esté utilizando. Para ver ejemplos, consulte los siguientes fragmentos de código de Python para los webhooks de Amazon Chime, Slack y Microsoft Teams. Estos códigos de ejemplo se proporcionan así. Son compatibles con la versión ejecutable de Python 3.7 .

Ejemplo de fragmento de código de Python para Amazon Chime

Los webhooks de Amazon Chime esperan una solicitud JSON con una cadena de mensaje correspondiente a una clave de contenido. Para obtener más información, consulte Webhooks for Amazon Chime.

Nota: En este ejemplo de código de función para webhooks de Amazon Chime, sustituya https://hooks.chime.aws/incomingwebhooks/xxxxxxx por la URL del 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,
        }
    )

Ejemplo de fragmento de código de Python para Slack

Los webhooks de entrada de Slack esperan una solicitud JSON con una cadena de mensaje correspondiente a una clave de texto. También admiten la personalización de mensajes, por ejemplo, añadir un nombre de usuario y un icono, o anular el canal predeterminado del webhook. Para obtener más información, consulte Sending messages using incoming webhooks en el sitio web de Slack.

Nota: En este ejemplo de código de función para webhooks de entrada de Slack, reemplace https://hooks.slack.com/services/xxxxxxx por la URL del webhook de entrada. Sustituya también #CHANNEL_NAME por el nombre del 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,
        }
    )

Ejemplo de fragmento de código de Python para Microsoft Teams

Los webhooks de entrada de Microsoft Teams también esperan una solicitud JSON con una cadena de mensaje correspondiente a una clave de «texto». Para obtener más información, consulte Crear y enviar mensajes en el sitio web de Microsoft Docs.

Nota: En este ejemplo de código de función para webhooks de entrada de Microsoft Teams, sustituya https://outlook.office.com/webhook/xxxxxxx por la URL del 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,
        }
    )

Prueba de la función de Lambda

  1. Elija su función en la página Funciones de la consola de Lambda.
  2. Seleccione la lista desplegable Probar. A continuación, elija Configurar un evento de prueba.
  3. En el cuadro de diálogo Configurar un evento de prueba, seleccione Crear un nuevo evento.
  4. En Plantilla de eventos, elija Notificación de tema de SNS.
  5. En Nombre del evento, introduzca un nombre para el evento de prueba.
  6. Elija Guardar.
  7. Una vez guardados los datos, seleccione Probar. A continuación, revise Resultado de la ejecución.
  • Si la invocación de prueba se realiza correctamente con un código de estado 200:
    Su webhook acepta el mensaje de notificación de Amazon SNS y lo envía al canal correspondiente.
  • Si la invocación falla con un código de estado 4xx:
    Compruebe la URL del webhook para confirmar si el par clave-valor es correcto y si el webhook de destino lo acepta.

Para obtener más información sobre las funciones de prueba en la consola de Lambda, consulte Invoke the Lambda function.

Agregación de un desencadenador de tema de SNS a su función de Lambda

Tras enviar un mensaje de SNS a su webhook en la consola de Lambda a modo de prueba, suscriba la función a su tema de SNS. Para realizar la configuración desde la consola de Lambda, añada un desencadenador de tema de SNS:

  1. Elija su función en la página Funciones de la consola de Lambda.
  2. En Información general de la función, seleccione Agregar desencadenador. Para obtener más información, consulte Invoking Lambda functions.
  3. En Configuración del desencadenador, elija Seleccionar un desencadenador. A continuación, seleccione SNS.
  4. En Tema de SNS, elija el tema de SNS que creó anteriormente.
  5. Elija Agregar.

Para obtener más información, consulte Configuring functions (console).

Con la función suscrita a su tema de SNS, los mensajes publicados en el tema se reenvían a la función y, a continuación, a su webhook.

Nota: Para obtener información sobre cómo recibir notificaciones de Amazon SNS a través de otros servicios de AWS, consulte Monitoring AWS Services using AWS Chatbot.


Información relacionada

Adding webhooks to chat rooms

Entrega de mensajes sin procesar

How do I subscribe a Lambda function to an Amazon SNS topic in the same account?

¿Cómo puedo resolver el error que recibo al suscribir una función de AWS Lambda a un origen de eventos push en AWS CloudFormation?