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

Lecture de 6 minute(s)
0

Je souhaite utiliser des webhooks pour connecter mon environnement AWS à ma salle de chat Amazon Chime, ou à ma chaîne Slack ou Microsoft Teams. Comment envoyer des notifications depuis Amazon Simple Notification Service (Amazon SNS) vers un webhook ?

Brève description

Amazon SNS permet d’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 lors de la confirmation de l’abonnement HTTP ou HTTPS.

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 du message Amazon SNS afin que le point de terminaison du webhook puisse le traiter, utilisez une fonction AWS Lambda.

**Remarque :Consultez la section ** Format JSON de notification HTTP et HTTPS. pour voir la liste des paires clé-valeur du document JSON du corps du message Amazon SNS.

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

Pour savoir comment créer une fonction Lambda, consultez la section Démarrage avec AWS Lambda. Pour plus d'informations, consultez la section 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 en fonction du type de point de terminaison webhook que vous utilisez. Les extraits de code Python suivants sont des exemples pour les webhooks Amazon Chime, Slack et Microsoft Teams. Ces exemples de code sont fournis tels quels. Ils sont compatibles avec l’environnement d’exécution Python 3.7 .

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 le section Création de 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.

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 de Slack attendent une requête JSON dont la chaîne de message correspond à une clé ** « texte »**. Ils permettent également de personnaliser les messages, par exemple en ajoutant un nom d’utilisateur et une icône, ou en remplaçant le canal par défaut du webhook. Pour en savoir plus, consultez la section Envoi de messages à l'aide de webhooks entrants sur le site Web de Slack.

**Remarque :**Dans cet exemple de code de fonction pour les webhooks entrants de Slack, remplacez https://hooks.slack.com/services/xxxxxxx par l’URL du webhook entrant. Remplacez également #CHANNEL_NAME par le nom de la chaîne de destination.

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 de Microsoft Teams attendent également une requête JSON dont la chaîne de message correspond à une clé « texte ». Pour en savoir plus, consultez Création et envoi des messages sur le site Web de Microsoft Docs.

Remarque : Dans cet exemple de code de fonction pour les webhooks entrants de Microsoft Teams, remplacez https://outlook.office.com/webhook/xxxxxxx par l’URL du 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,
        }
    )

Tester la fonction Lambda

  1. Sur la page Fonctions de la console Lambda, choisissez votre fonction.
  2. Choisissez la liste déroulante Test. Choisissez ensuite Configurer un événement de test.
  3. Dans la boîte de dialogue Configurer un événement de test, sélectionnez Créer un nouvel événement.
  4. Dans Modèle d’événement, choisissez SNS Topic Notification.
  5. Dans Nom de l’événement, entrez le nom de l’événement de test.
  6. Sélectionnez Enregistrer.
  7. Une fois enregistré, choisissez Tester. Ensuite, consultez le résultat de l’exécution.
  • Si l’invocation du test aboutit avec un code d’état 200 :
    Le message de notification Amazon SNS est accepté par votre webhook, qui le transmet au canal correspondant.
  • Si l’invocation échoue avec un code d’état 4xx :
    Vérifiez l’URL du webhook pour vous assurer que la paire clé-valeur est correcte et que votre webhook de destination l’accepte.

Pour plus d’informations sur les fonctions de test dans la console Lambda, consultez Invocation de la fonction Lambda.

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

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

  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. Pour plus d’informations, consultez la section Invocation de la fonction Lambda.
  3. Dans Configuration du déclencheur, choisissez Sélectionner un déclencheur. Choisissez ensuite SNS.
  4. Dans le champ rubrique SNS, choisissez la rubrique SNS que vous avez créée précédemment.
  5. Choisissez Ajouter.

Pour en savoir plus, consultez la section Configuration des options de fonction Lambda.

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

**Remarque :**Pour plus d’informations sur la façon de recevoir des notifications Amazon SNS sur d’autres services AWS, consultez la section Monitoring AWS services using AWS Chatbot.


Informations complémentaires

Ajouter des webhooks à un salon de discussion

Remise des messages bruts

Comment abonner une fonction Lambda à un sujet Amazon SNS dans le même compte ?

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 AWS CloudFormation ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an