Comment utiliser des webhooks pour publier des messages Amazon SNS dans Amazon Chime, Slack ou Microsoft Teams ?

Dernière mise à jour : 11/08/2022

Je veux utiliser des webhooks pour connecter mon environnement AWS à ma salle de discussion Amazon Chime ou à mon canal Slack ou Microsoft Teams. Comment envoyer des notifications depuis Amazon Simple Notification Service (Amazon SNS) vers un webhook ?

Brève description

Vous pouvez utiliser Amazon SNS pour envoyer des messages de notification à des points de terminaison HTTP(S), tels que des URL de webhook. Toutefois, certains webhooks attendent des paires clé-valeur JSON qu'Amazon SNS ne prend pas en charge lors de la confirmation de l'abonnement HTTP(S).

Par exemple, les webhooks Amazon Chime attendent une demande JSON avec une chaîne de message correspondant à une clé « Contenu ». De même, les webhooks Slack et Microsoft Teams attendent tous les deux une demande JSON avec une chaîne de message correspondant à une clé "text".

Utilisez une fonction AWS Lambda pour transformer le document JSON du corps du message Amazon SNS pour le point de terminaison du webhook à traiter.

Remarque : pour obtenir la liste des paires clé-valeur dans le document JSON du corps du message Amazon SNS, consultez Format JSON des notifications HTTP/HTTPS.

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

Pour obtenir les instructions de création d'une fonction Lambda, consultez Démarrer avec AWS Lambda. Pour plus d'informations, consultez Utilisation d'AWS Lambda avec Amazon SNS.

Le code de votre fonction Lambda doit inclure une logique permettant de transformer les messages de notification de votre rubrique SNS pour le type de point de terminaison de webhook que vous utilisez. Pour obtenir des exemples, consultez les extraits de code Python suivants des webhooks Amazon Chime, Slack et Microsoft Teams. Ces exemples de code sont fournis en l'état. Ils sont compatibles avec l'environnement d'exécution Python 3.6.

Exemple d'extrait de code Python pour Amazon Chime

Les webhooks Amazon Chime attendent une requête JSON avec une chaîne de message correspondant à une clé « Contenu » . Pour plus d'informations, consultez Webhooks pour Amazon Chime.

Remarque : dans cet exemple de code de fonction pour les webhooks Amazon Chime, remplacez https://hooks.chime.aws/incomingwebhooks/xxxxxxx par l'URL du webhook.

#!/usr/bin/python3.6
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,
        }
    )

Exemple d'extrait de code Python pour Slack

Les webhooks entrants Slack attendent une demande JSON avec une chaîne de message correspondant à une clé « texte ». Ils prennent également en charge la personnalisation des messages, comme l'ajout d'un nom d'utilisateur et d'une icône, ou le remplacement du canal par défaut du webhook. Pour plus d'informations, consultez Envoi de messages à l'aide de webhooks entrants sur le site Web Slack.

Remarque : dans cet exemple de code de fonction pour les webhooks entrants Slack, remplacez https://hooks.slack.com/services/xxxxxxx par l'URL du webhook entrant. Remplacez également #CHANNEL_NAME par le nom du canal de destination.

#!/usr/bin/python3.6
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,
        }
    )

Exemple d'extrait de code Python pour Microsoft Teams

Les webhooks entrants Microsoft Teams attendent également une demande JSON avec une chaîne de message correspondant à une clé "text" . Pour plus d'informations, consultez Création et envoi de messages sur le site Web Microsoft Docs.

Remarque : dans cet exemple de code de fonction pour les webhooks entrants Microsoft Teams, remplacez https://outlook.office.com/webhook/xxxxxxx par l'URL du webhook.

#!/usr/bin/python3.6
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,
        }
    )

Tester la fonction Lambda

  1. Sur la page Functions (Fonctions) de la console Lambda, choisissez votre fonction.
  2. Choisissez la liste déroulante Test. Ensuite, choisissez Configure test event (Configurer un événement de test).
  3. Dans la boîte de dialogue Configure test event (Configurer un événement de test), choisissez Create new event (Créer un nouvel événement).
  4. Pour Event template (Modèle d'événement), choisissez SNS Topic Notification (Notification de rubrique SNS).
  5. Pour Event name (Nom de l'événement), saisissez le nom de l'événement de test.
  6. Choisissez Save (Enregistrer).
  7. Une fois qu'il est enregistré, choisissez Test. Ensuite, vérifiez le Execution result (Résultat de l'exécution).

Si l'appel de test aboutit avec le code de statut 200, le message de notification Amazon SNS est accepté par votre webhook qui le transmet au canal correspondant. Si l'appel échoue avec un code de statut 4xx, vérifiez l'URL du webhook pour vous assurer que la paire clé-valeur est correcte et acceptée par votre webhook de destination.

Pour plus d'informations sur le test des fonctions dans la console Lambda, consultez Appel de la fonction Lambda.

Ajouter un déclencheur de rubrique SNS à votre fonction Lambda

Après avoir envoyé un message SNS à votre webhook en tant que test dans la console Lambda, abonnez votre fonction à votre rubrique SNS. Pour configurer cela à partir de la console Lambda, ajoutez un déclencheur de rubrique SNS :

  1. Sur la page Functions (Fonctions) de la console Lambda, choisissez votre fonction.
  2. Sous Function overview (Vue d'ensemble des fonctions), choisissez Add trigger (Ajouter un déclencheur). Pour plus d'informations, consultez Appel des fonctions Lambda.
  3. Sous Trigger configuration (Configuration du déclencheur), choisissez Select a trigger (Sélectionner un déclencheur). Ensuite, choisissez SNS.
  4. Pour SNS topic (Rubrique SNS), choisissez la rubrique SNS que vous avez créée précédemment.
  5. Choisissez Add (Ajouter).

Pour plus d'informations, consultez Configuration des fonctions (console).

Une fois votre fonction abonnée à votre rubrique SNS, les messages publiés dans la rubrique sont envoyés à la fonction, puis à votre webhook.

Remarque : pour plus d'informations sur la façon d'obtenir des notifications Amazon SNS via d'autres services AWS, consultez Monitoring AWS Services using AWS Chatbot (Surveillance des services AWS à l'aide d'AWS Chatbot).