Didacticiel : création d’un point de terminaison webhook à l’aide d’une URL de fonction Lambda
Dans ce didacticiel, vous créez une URL de fonction Lambda pour implémenter un point de terminaison webhook. Un webhook est une communication légère pilotée par les événements qui envoie automatiquement des données entre applications via HTTP. Vous pouvez utiliser un webhook pour recevoir des mises à jour immédiates sur les événements survenant dans un autre système, par exemple lorsqu’un nouveau client s’inscrit sur un site Web, qu’un paiement est traité ou qu’un fichier est chargé.
Avec Lambda, les webhooks peuvent être implémentés à l’aide d’URL de fonction Lambda ou d’API Gateway. Les URL de fonction sont un bon choix pour les webhooks simples qui ne nécessitent pas de fonctionnalités comme l’autorisation avancée ou la validation des demandes.
Astuce
Si vous ne savez pas quelle est la solution la mieux adaptée à votre cas d’utilisation particulier, consultez Sélection d’une méthode pour invoquer votre fonction Lambda à l’aide d’une requête HTTP.
Prérequis
Pour terminer ce didacticiel, Python (version 3.8 ou ultérieure) ou Node.js (version 18 ou ultérieure) doit être installé sur votre machine locale.
Pour tester le point de terminaison à l’aide d’une requête HTTP, le didacticiel utilise curl
Créer la fonction Lambda
Créez d’abord la fonction Lambda qui s’exécute lorsqu’une requête HTTP est envoyée à votre point de terminaison webhook. Dans cet exemple, l’application d’envoi envoie une mise à jour chaque fois qu’un paiement est soumis, et indique dans le corps de la requête HTTP si le paiement a été effectué avec succès. La fonction Lambda analyse la demande et agit en fonction du statut du paiement. Dans cet exemple, le code imprime simplement l’ID de commande pour le paiement, mais dans une application réelle, vous pouvez ajouter la commande à une base de données ou envoyer une notification.
La fonction implémente également la méthode d’authentification la plus couramment utilisée pour les webhooks, l’authentification des messages basée sur le hachage (HMAC). Avec cette méthode, les applications d’envoi et de réception partagent une clé secrète. L’application d’envoi utilise un algorithme de hachage pour générer une signature unique à l’aide de cette clé associée au contenu du message, et inclut la signature dans la demande de webhook sous forme d’en-tête HTTP. L’application réceptrice répète ensuite cette étape en générant la signature à l’aide de la clé secrète, et compare la valeur obtenue avec la signature envoyée dans l’en-tête de la demande. Si le résultat correspond, la demande est considérée comme légitime.
Créez la fonction à l’aide de la console Lambda avec l’environnement d'exécution Python ou Node.js.
Créer la clé de secret
Pour que la fonction Lambda authentifie la demande de webhook, elle utilise une clé secrète qu’elle partage avec l’application appelante. Dans cet exemple, la clé est stockée dans une variable d’environnement. Dans une application de production, n’incluez pas d’informations sensibles telles que des mots de passe dans votre code de fonction. Créez plutôt un secret AWS Secrets Manager, puis utilisez l’extension Lambda AWS Parameters and Secrets pour récupérer vos informations d’identification dans votre fonction Lambda.
Créer et stocker la clé secrète du webhook
-
Générez une longue chaîne aléatoire à l’aide d’un générateur de nombres aléatoires sécurisé par cryptographie. Vous pouvez utiliser les extraits de code suivants en Python ou Node.js pour générer et imprimer un secret de 32 caractères, ou utiliser votre propre méthode préférée.
-
Stockez la chaîne générée en tant que variable d’environnement pour votre fonction en procédant comme suit :
-
Dans l’onglet Configuration de votre fonction, sélectionnez Variables d’environnement.
-
Choisissez Modifier.
-
Choisissez Ajouter une variable d’environnement.
-
Pour Clé, saisissez
WEBHOOK_SECRET, puis pour Valeur, saisissez le secret que vous avez généré à l’étape précédente. -
Choisissez Enregistrer.
-
Vous devrez réutiliser ce secret ultérieurement dans le didacticiel pour tester votre fonction. Veillez donc à le noter dès maintenant.
Créer le point de terminaison d’URL de fonction
Créez un point de terminaison pour votre webhook à l’aide d’une URL de fonction Lambda. Comme vous utilisez le type d’authentification NONE pour créer un point de terminaison avec accès public, toute personne disposant de l’URL peut invoquer votre fonction. Pour en savoir plus sur le contrôle de l’accès aux URL de fonction, consultez Contrôle d’accès aux URL de fonctions Lambda. Si vous avez besoin d’options d’authentification plus avancées pour votre webhook, pensez à utiliser API Gateway.
Créer le point de terminaison d’URL de fonction
-
Dans l’onglet Configuration de votre fonction, sélectionnez URL de la fonction.
-
Choisissez Create function URL (Créer une URL de fonction).
-
Pour Type d’authentification, sélectionnez NONE.
-
Choisissez Enregistrer.
Le point de terminaison de l’URL de fonction que vous venez de créer s’affiche dans le volet URL de fonction. Copiez le point de terminaison ; vous l’utiliserez ultérieurement dans le didacticiel.
Tester la fonction dans console
Avant d’utiliser une requête HTTP pour invoquer votre fonction à l’aide du point de terminaison d’URL, testez-la dans la console pour vérifier que votre code fonctionne comme prévu.
Pour vérifier la fonction dans la console, vous devez d’abord calculer une signature de webhook à l’aide du secret que vous avez généré plus tôt dans le didacticiel avec les données utiles JSON de test suivantes :
{ "type": "payment.success", "orderId": "1234", "amount": "99.99" }
Utilisez l’un des exemples de code Python ou Node.js suivants pour calculer la signature du webhook à l’aide de votre propre secret.
Vous pouvez désormais tester le code de votre fonction à l’aide d’une requête HTTP de test dans la console.
Tester la fonction dans console
-
Sélectionnez l’onglet Code correspondant à votre fonction.
-
Dans la section ÉVÉNEMENTS DE TEST, choisissez Créer un nouvel événement de test.
-
Dans Event Name (Nom de l'événement), saisissez
myEvent. -
Remplacez le JSON existant en copiant et en collant ce qui suit dans le volet JSON d’événement. Remplacez la signature de webhook par la valeur calculée à l’étape précédente.
{ "headers": { "Content-Type": "application/json", "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a" }, "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}" } -
Choisissez Enregistrer.
-
Sélectionnez Invoke.
Vous devez voir des résultats similaires à ce qui suit :
Tester la fonction avec une requête HTTP
Utilisez l’outil de ligne de commande curl pour tester votre point de terminaison webhook.
Tester la fonction avec des requêtes HTTP
-
Dans un terminal ou un programme shell, exécutez la commande curl suivante. Remplacez l’URL par la valeur du point de terminaison de votre URL de fonction et remplacez la signature du webhook par la signature que vous avez calculée à l’aide de votre propre clé secrète.
curl -X POSThttps://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/\ -H "Content-Type: application/json" \ -H "x-webhook-signature:d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'Vous devriez voir la sortie suivante :
{"received": true} -
Consultez les journaux CloudWatch de votre fonction pour vérifier qu’elle a correctement analysé les données utiles en procédant comme suit :
-
Dans la console Amazon CloudWatch, ouvrez la page Groupe de journaux
. -
Sélectionnez le groupe de journaux de votre fonction (
/aws/lambda/myLambdaWebhook). -
Sélectionnez le flux de journaux le plus récent.
Vous devez voir des résultats similaires à ce qui suit dans les journaux de votre fonction :
-
-
Confirmez que votre code détecte une signature non valide en exécutant la commande curl suivante. Remplacez l’URL par le point de terminaison de l’URL de votre propre fonction.
curl -X POSThttps://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/\ -H "Content-Type: application/json" \ -H "x-webhook-signature: abcdefg" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'Vous devriez voir la sortie suivante :
{"error": "Invalid signature"}
Nettoyage de vos ressources
Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant des ressources AWS que vous n’utilisez plus, vous évitez les frais superflus pour votre Compte AWS.
Pour supprimer la fonction Lambda
-
Ouvrez la page Functions (Fonctions)
de la console Lambda. -
Sélectionnez la fonction que vous avez créée.
-
Choisissez Actions, Delete.
-
Saisissez
confirmdans la zone de saisie de texte et choisissez Delete (Supprimer).
Lorsque vous avez créé la fonction Lambda dans la console, Lambda a également créé un rôle d’exécution pour votre fonction.
Pour supprimer le rôle d’exécution
-
Ouvrez la page Roles (Rôles)
de la console IAM. -
Sélectionnez le rôle d’exécution que Lambda a créé. Le nom du rôle est au format
myLambdaWebhook-role-<random string>. -
Sélectionnez Delete (Supprimer).
-
Saisissez le nom du rôle dans le champ de saisie de texte et choisissez Delete (Supprimer).