Saltar al contenido

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

5 minutos de lectura
0

Quiero enviar notificaciones de los mensajes de Amazon Simple Notification Service (Amazon SNS) a Amazon Chime, Slack o Microsoft Teams.

Descripción corta

Puedes 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 que corresponde a una clave de contenido. Por su parte, los webhooks de Slack y Microsoft Teams esperan una solicitud JSON con una cadena de mensaje que corresponde a una clave de texto.

Para transformar el documento JSON del cuerpo de un mensaje de Amazon SNS para que el punto de enlace del webhook pueda procesarlo, utiliza una función de AWS Lambda.

Nota: Para obtener una lista de los pares clave-valor del documento JSON del cuerpo de un mensaje de Amazon SNS, consulta el formato JSON de confirmación de suscripción HTTP/HTTPS.

Resolución

Creación de un tema de SNS

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

Creación de una función de Lambda

Sigue las instrucciones para crear una función de Lambda. 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 utilices.

Para ver ejemplos, consulta los siguientes fragmentos de código de Python para los webhooks de Amazon Chime, Slack y Microsoft Teams.

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 que corresponde a una clave de contenido. Para obtener más información, consulta Creación de webhooks para 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,
        }
    )

Nota: Sustituye https://hooks.chime.aws/incomingwebhooks/xxxxxxx por la URL de tu webhook.

Ejemplo de fragmento de código de Python para Slack

Los webhooks de Slack esperan una solicitud JSON con una cadena de mensaje que corresponde a una clave de texto. También admiten la personalización de mensajes para agregar un nombre de usuario y un icono, o anular el canal predeterminado del webhook. Para obtener más información, consulta Envío de mensajes mediante webhooks entrantes en el sitio web de 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,
        }
    )

Nota: Sustituye https://hooks.slack.com/services/xxxxxxx por la URL de tu webhook y #CHANNEL_NAME por el nombre del canal de destino.

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

Los webhooks de Microsoft Teams esperan una solicitud JSON con una cadena de mensaje que corresponde a una clave de texto. Para obtener más información, consulta Crear y enviar mensajes en el sitio web de 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,
        }
    )

Nota: Sustituye https://outlook.office.com/webhook/xxxxxxx por la URL de tu webhook.

Prueba de la función de Lambda

Sigue estos pasos:

  1. Elige tu función en la página Funciones de la consola de Lambda.
  2. Abre la pestaña Probar. En Nombre del evento, introduce un nombre.
  3. Elige la lista desplegable de plantillas y, a continuación, selecciona Notificación de temas de SNS.
  4. Selecciona Guardar y, a continuación, selecciona Probar.

Si la invocación de prueba se realiza correctamente con un código de estado 200, tu webhook ha aceptado el mensaje de notificación de Amazon SNS y lo ha enviado al canal.

Si la invocación de prueba falla con un código de estado 4xx, verifica que el par clave-valor de la URL del webhook sea correcto y que el webhook de destino lo acepte.

Para obtener más información, consulta Invocación de la función de Lambda mediante la consola de editor de código.

Adición de un tema de SNS y suscripción de la función de Lambda al tema

Sigue estos pasos:

  1. Elige tu función en la página Funciones de la consola de Lambda.
  2. En Información general de la función, selecciona Agregar desencadenador.
  3. Elige la lista desplegable Configuración de desencadenadores y, a continuación, selecciona SNS.
  4. En Tema de SNS, elige el tema de SNS que creaste anteriormente.
  5. Elige Agregar.
  6. Suscribe tu función de Lambda al tema de SNS.

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

Información relacionada

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

Supervisión de los servicios de AWS con Amazon Q Developer en aplicaciones de chat