Passer au contenu

Comment publier des messages Amazon SNS sur Amazon Chime, Slack ou Microsoft Teams à l’aide de webhooks ?

Lecture de 5 minute(s)
0

Je souhaite envoyer des notifications depuis des messages Amazon Simple Notification Service (Amazon SNS) à Amazon Chime, Slack ou Microsoft Teams.

Brève description

Vous pouvez utiliser Amazon SNS pour envoyer des messages de notification à des points de terminaison HTTP ou HTTPS, tels que des URL de webhook. Cependant, certains webhooks attendent des paires clé-valeur JSON qu’Amazon SNS ne prend pas en charge lorsque l’abonnement HTTP ou HTTPS est confirmé.

Par exemple, les webhooks Amazon Chime attendent une requête JSON dont la chaîne de message correspond à une clé Contenu. De même, les webhooks Slack et Microsoft Teams attendent tous deux une requête JSON dont la chaîne de message correspond à une clé texte.

Pour transformer le document JSON du corps d'un message Amazon SNS afin que le point de terminaison de webhook puisse le traiter, utilisez une fonction AWS Lambda.

Remarque : Pour obtenir une liste de paires clé-valeur du document JSON d’un corps de message Amazon SNS, consultez la section Format JSON de confirmation d'abonnement HTTP/HTTPS.

Résolution

Créer une rubrique SNS

Si ce n’est pas déjà fait, créez une rubrique SNS avec un nom unique.

Créer une fonction Lambda

Suivez les instructions pour créer une fonction Lambda. Le code de votre fonction Lambda doit inclure une logique permettant de transformer les messages de notification de votre rubrique SNS en fonction du type de point de terminaison de webhook que vous utilisez.

Les extraits de code Python suivants sont des exemples pour les webhooks Amazon Chime, Slack et Microsoft Teams.

Exemple d'extrait de code Python pour Amazon Chime

Les webhooks Amazon Chime attendent une requête JSON dont la chaîne de message correspond à une clé Contenu. Pour en savoir plus, consultez la section Création de webhooks pour 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,
        }
    )

Remarque : Remplacez https://hooks.chime.aws/incomingwebhooks/xxxxxxx par l'URL de votre webhook.

Exemple d’extrait de code Python pour Slack

Les webhooks Slack attendent une requête JSON avec une chaîne de message correspondant à une clé texte. Ils prennent également en charge la personnalisation des messages pour ajouter un nom d'utilisateur et une icône, ou remplacer le canal par défaut du webhook. Pour en savoir plus, consultez la page Envoi de messages à l'aide de webhooks entrants sur le site 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,
        }
    )

Remarque : Remplacez https://hooks.slack.com/services/xxxxxxx par l'URL de votre webhook et #CHANNEL_NAME par le nom de la chaîne de destination.

Exemple d’extrait de code Python pour Microsoft Teams

Les webhooks Microsoft Teams attendent une requête JSON avec une chaîne de message correspondant à une clé texte. Pour en savoir plus, consultez la page Créer et envoyer des messages sur le site 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,
        }
    )

Remarque : Remplacez https://outlook.office.com/webhook/xxxxxxx par l'URL de votre webhook.

Tester la fonction Lambda

Procédez comme suit :

  1. Sur la page Fonctions de la console Lambda, choisissez votre fonction.
  2. Ouvrez l'onglet Test. Dans Nom de l’événement, saisissez un nom.
  3. Choisissez la liste déroulante Modèle, puis sélectionnez Notification de rubrique SNS.
  4. Sélectionnez Enregistrer, puis Tester.

Si l'invocation de test aboutit avec un code d'état 200, le message de notification Amazon SNS a été accepté par votre webhook et transmis au canal.

Si l'invocation de test échoue avec un code d'état 4xx, vérifiez que la paire clé-valeur de l'URL du webhook est correcte et acceptée par votre webhook de destination.

Pour en savoir plus, consultez la page Invoquer la fonction Lambda à l'aide de l’éditeur de code de la console.

Ajouter une rubrique SNS et s’abonner à la fonction Lambda

Procédez comme suit :

  1. Sur la page Fonctions de la console Lambda, choisissez votre fonction.
  2. Sous Présentation de la fonction, sélectionnez Ajouter un déclencheur.
  3. Sélectionnez la liste déroulante Configuration du déclencheur, puis sélectionnez S3.
  4. Dans Rubrique SNS, choisissez la rubrique SNS que vous avez créée précédemment.
  5. Sélectionnez Ajouter.
  6. Abonnez votre fonction Lambda à la rubrique SNS.

Lorsque votre fonction est abonnée à votre rubrique SNS, les messages publiés sur cette rubrique sont transférés vers la fonction et votre webhook.

Informations connexes

Comment résoudre l’erreur que je reçois lorsque j’abonne une fonction AWS Lambda à une source d’événement basée sur la technologie push dans CloudFormation ?

Surveillance des services AWS à l'aide d'Amazon Q Developer dans les applications de chat