Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Dans ce didacticiel, vous allez créer une URL de fonction Lambda pour implémenter un point de terminaison Webhook. Un webhook est une communication légère pilotée par des événements qui envoie automatiquement des données entre les 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 téléchargé.
Avec Lambda, les webhooks peuvent être implémentés à l'aide de la fonction Lambda ou d'API Gateway. URLs URLs Les fonctions sont un bon choix pour les webhooks simples qui ne nécessitent pas de fonctionnalités telles que l'autorisation avancée ou la validation des demandes.
Astuce
Si vous ne savez pas quelle solution convient le mieux à votre cas d'utilisation, consultezSé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) doivent être installés 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 le numéro 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 le runtime Python ou Node.js.
Créer la fonction Lambda
Ouvrez la page Functions
(Fonctions) de la console Lambda. -
Créez une fonction de base « Hello world » en procédant comme suit :
-
Sélectionnez Create function (Créer une fonction).
-
Sélectionnez Créer à partir de zéro.
-
Sous Nom de la fonction, saisissez
myLambdaWebhook
. -
Pour Runtime, sélectionnez python3.13.
-
Sélectionnez Create function (Créer une fonction).
-
-
Dans le volet Source du code, remplacez le code existant en copiant et en collant ce qui suit :
import json import hmac import hashlib import os def lambda_handler(event, context): # Get the webhook secret from environment variables webhook_secret = os.environ['WEBHOOK_SECRET'] # Verify the webhook signature if not verify_signature(event, webhook_secret): return { 'statusCode': 401, 'body': json.dumps({'error': 'Invalid signature'}) } try: # Parse the webhook payload payload = json.loads(event['body']) # Handle different event types event_type = payload.get('type') if event_type == 'payment.success': # Handle successful payment order_id = payload.get('orderId') print(f"Processing successful payment for order {order_id}") # Add your business logic here # For example, update database, send notifications, etc. elif event_type == 'payment.failed': # Handle failed payment order_id = payload.get('orderId') print(f"Processing failed payment for order {order_id}") # Add your business logic here else: print(f"Received unhandled event type: {event_type}") # Return success response return { 'statusCode': 200, 'body': json.dumps({'received': True}) } except json.JSONDecodeError: return { 'statusCode': 400, 'body': json.dumps({'error': 'Invalid JSON payload'}) } except Exception as e: print(f"Error processing webhook: {e}") return { 'statusCode': 500, 'body': json.dumps({'error': 'Internal server error'}) } def verify_signature(event, webhook_secret): """ Verify the webhook signature using HMAC """ try: # Get the signature from headers signature = event['headers'].get('x-webhook-signature') if not signature: print("Error: Missing webhook signature in headers") return False # Get the raw body (return an empty string if the body key doesn't exist) body = event.get('body', '') # Create HMAC using the secret key expected_signature = hmac.new( webhook_secret.encode('utf-8'), body.encode('utf-8'), hashlib.sha256 ).hexdigest() # Compare the expected signature with the received signature to authenticate the message is_valid = hmac.compare_digest(signature, expected_signature) if not is_valid: print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}") return False return True except Exception as e: print(f"Error verifying signature: {e}") return False
-
Dans la section DÉPLOYER, choisissez Déployer pour mettre à jour le code de votre fonction.
Créez la clé secrète
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, nous vous recommandons de l'utiliser AWS Secrets Manager comme option plus sûre. Pour en savoir plus sur l'utilisation de Secrets Manager pour stocker des clés secrètes, consultez les sections Créer un AWS Secrets Manager secret et Obtenir des secrets AWS Secrets Manager dans le Guide de AWS Secrets Manager l'utilisateur.
Création et stockage de 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 dans 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.
Exemple code pour générer un secret
import secrets webhook_secret = secrets.token_urlsafe(32) print(webhook_secret)
-
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é, entrez
WEBHOOK_SECRET
, puis pour Valeur, entrez le secret que vous avez généré à l'étape précédente. -
Choisissez Save (Enregistrer).
-
Vous devrez réutiliser ce secret plus tard dans le didacticiel pour tester votre fonction, alors prenez-en note dès maintenant.
Créez le point de terminaison URL de la 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 fonctions URLs, voirContrôler l'accès à la fonction Lambda URLs. Si vous avez besoin d'options d'authentification plus avancées pour votre webhook, pensez à utiliser API Gateway.
Créez le point de terminaison URL de la 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 le type d'authentification, sélectionnez AUCUN.
-
Choisissez Save (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 à utiliser ultérieurement dans le didacticiel.
Testez la fonction dans la console
Avant d'utiliser une requête HTTP pour appeler votre fonction à l'aide du point de terminaison 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 webhook à l'aide du secret que vous avez généré plus tôt dans le didacticiel avec la charge utile JSON de test suivante :
{
"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.
Calculer la signature du webhook
-
Enregistrez le code suivant sous forme de fichier nommé
calculate_signature.py
. Remplacez le secret du webhook dans le code par votre propre valeur.import secrets import hmac import json import hashlib webhook_secret = "
arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M
" body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"}) signature = hmac.new( webhook_secret.encode('utf-8'), body.encode('utf-8'), hashlib.sha256 ).hexdigest() print(signature) -
Calculez la signature en exécutant la commande suivante depuis le répertoire dans lequel vous avez enregistré le code. Copiez la signature émise par le code.
python calculate_signature.py
Vous pouvez désormais tester le code de votre fonction à l'aide d'une requête HTTP de test dans la console.
Testez la fonction dans la 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 Event JSON. Remplacez la signature du webhook par la valeur que vous avez 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 Save (Enregistrer).
-
Sélectionnez Invoquer .
Vous devez voir des résultats similaires à ce qui suit :
Status: Succeeded Test Event Name: myEvent Response: { "statusCode": 200, "body": "{\"received\": true}" } Function Logs: START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST Processing successful payment for order 1234 END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Duration: 1.55 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 36 MB Init Duration: 136.32 ms
Testez la fonction à l'aide d'une requête HTTP
Utilisez l'outil de ligne de commande curl pour tester le point de terminaison de votre webhook.
Testez la fonction à l'aide de 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 l'URL de votre 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 POST
https://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}
-
Examinez les CloudWatch journaux de votre fonction pour confirmer qu'elle a correctement analysé la charge utile en procédant comme suit :
-
Ouvrez la page du groupe Logs
dans la CloudWatch console Amazon. -
Sélectionnez le groupe de journaux de votre fonction (
/aws/lambda/myLambdaWebhook
). -
Sélectionnez le flux de journaux le plus récent.
Vous devriez voir un résultat similaire à ce qui suit dans les journaux de votre fonction :
Processing successful payment for order 1234
-
-
Vérifiez 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 POST
https://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 AWS les ressources que vous n'utilisez plus, vous évitez des frais inutiles 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.
-
Sélectionnez Actions, Supprimer.
-
Saisissez
confirm
dans 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 créé par Lambda. Le rôle a le format du nom
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).