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

Date de la dernière mise à jour : 29/04/2020

Je souhaite 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) à 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 entrants Slack et Microsoft Teams attendent tous les deux une demande JSON avec une chaîne de message correspondant à une clé « texte ».

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

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

Solution

Créer une rubrique SNS

Si vous ne l'avez 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.

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
    })

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, et 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
    })

Les webhooks entrants Microsoft Teams attendent également une demande JSON avec une chaîne de message correspondant à une clé « texte » . Pour plus d'informations, consultez Configuration d'un webhook entrant personnalisé 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 Fonctions de la console Lambda, choisissez votre fonction.
  2. Dans la partie supérieure droite, choisissez Sélectionner un événement de test, puis Configurer des événements de test.
  3. Dans la boîte de dialogue Configurer un événement de test, sélectionnez Créer un événement de test.
  4. Pour Modèle d'événement, choisissez Notification de rubrique Amazon SNS.
  5. Pour Nom de l’événement), entrez le nom de l'événement de test.
  6. Sélectionnez Créer.
  7. Choisissez Tester.
  8. Vérifiez le 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 et 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é avec succès un message SNS à votre webhook en tant que test dans la console Lambda, abonnez votre fonction à votre rubrique SNS. Vous pouvez configurer cela à partir de la console Lambda en ajoutant un déclencheur de rubrique SNS.

  1. Sur la page Fonctions de la console Lambda, choisissez votre fonction.
  2. Sous Concepteur, choisissez Ajouter un déclencheur. Pour plus d'informations, consultez Utilisation du concepteur.
  3. Sous Configuration du déclencheur, choisissez Sélectionner un déclencheur, puis SNS.
  4. Pour Rubrique SNS, choisissez la rubrique SNS que vous avez créée précédemment.
  5. Cochez la case Activer le déclencheur.
  6. Sélectionnez Ajouter.

Pour plus d'informations, consultez Configuration des fonctions dans la console AWS Lambda.

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

Conseil : utilisez les alarmes Amazon CloudWatch pour recevoir des notifications Amazon SNS dans Amazon Chime, Slack ou Microsoft Teams lorsqu'une alarme est déclenchée.