Débogage d'AWS Lambda : Erreurs d'invocation courantes et comment les corriger
Maîtrisez l'art du débogage des fonctions AWS Lambda. Ce guide complet détaille les échecs d'invocation les plus courants, allant des problèmes d'autorisations IAM et des problèmes de connectivité VPC aux contraintes de ressources telles que l'épuisement de la mémoire et les délais d'attente de la fonction. Apprenez à utiliser efficacement les journaux CloudWatch et à appliquer des correctifs pratiques et exploitables — y compris l'optimisation des configurations, la gestion des dépendances et la correction des rôles d'exécution — pour garantir des performances de fonctions serverless fiables et cohérentes.
Débogage d'AWS Lambda : Erreurs d'Invocation Courantes et Comment les Résoudre
Les erreurs d'invocation AWS Lambda proviennent généralement de l'un de ces trois endroits : l'appelant ne peut pas invoquer la fonction, Lambda ne peut pas démarrer l'environnement d'exécution, ou votre code démarre puis échoue. Le correctif le plus rapide consiste à identifier l'étape qui a échoué avant de modifier la mémoire, le délai d'attente, les politiques IAM ou les paramètres VPC.
Commencez par les logs CloudWatch, puis confirmez les autorisations, les paramètres du gestionnaire, les dépendances et la mise en réseau dans cet ordre.
Établir la Base de Référence du Débogage : Logs CloudWatch
Avant de modifier la fonction, vérifiez le groupe de logs /aws/lambda/NomDeVotreFonction. Une exécution Lambda normale inclut généralement ces lignes de log de plateforme :
- START : Indique le début de l'exécution.
- END : Indique la fin de l'exécution.
- REPORT : Fournit des métriques récapitulatives (Durée, Durée Facturée, Mémoire Utilisée, Mémoire Maximale Utilisée et détails de traçage X-Ray).
Si la fonction ne démarre jamais, vous ne verrez peut-être pas de logs d'application. Dans ce cas, vérifiez le service appelant, le résultat du test dans la console Lambda, les événements CloudTrail et la politique basée sur les ressources de la fonction.
Résoudre les Erreurs d'Autorisation et d'Accès
Les erreurs d'autorisation sont sans doute la cause la plus courante d'échec d'invocation Lambda. Elles se répartissent généralement en deux catégories : la fonction n'a pas l'autorisation de s'exécuter, ou l'entité appelante n'a pas l'autorisation d'appeler la fonction.
Échecs du Rôle d'Exécution (Rôle IAM)
Chaque fonction Lambda doit assumer un rôle d'exécution IAM. Si ce rôle est mal configuré, la fonction ne peut pas interagir avec les services AWS nécessaires.
Autorisations Manquantes Courantes :
| Accès au Service Nécessaire | Actions de Politique IAM Requises |
|---|---|
| Journalisation dans CloudWatch | logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents |
| Connectivité VPC | ec2:CreateNetworkInterface, ec2:DeleteNetworkInterface, ec2:DescribeNetworkInterfaces |
| Lecture S3/DynamoDB | s3:GetObject, dynamodb:GetItem, etc. |
Correctif :
- Accédez à la configuration de la fonction Lambda dans la console AWS.
- Vérifiez l'onglet "Autorisations" et examinez la politique du rôle IAM attaché.
- Assurez-vous que le rôle dispose de la politique gérée AWS de base
AWSLambdaBasicExecutionRoleou que sa politique personnalisée inclut les actions CloudWatch nécessaires. - Ajoutez uniquement les autorisations de service dont votre code a réellement besoin, comme
s3:GetObjectpour un préfixe de bucket spécifique.
Erreurs de Politique Basée sur les Ressources (Autorisations d'Invocation)
Si votre Lambda est invoquée par un autre service (comme S3, API Gateway, SNS ou une invocation跨compte), ce service a besoin d'une autorisation explicite pour appeler votre fonction.
Symptôme : Le service (par exemple, S3) tente de déclencher la Lambda, mais rien n'apparaît dans les logs CloudWatch et le service signale une erreur.
Correctif : utilisez la commande CLI add-permission ou le paramètre équivalent dans la console pour accorder les droits d'invocation. Par exemple, pour autoriser un bucket S3 à invoquer la fonction :
aws lambda add-permission \
--function-name ma-fonction-de-traitement \
--statement-id S3InvokePermission \
--action lambda:InvokeFunction \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::mon-bucket-declencheur
Pour les invocations跨compte, vérifiez les deux côtés : l'appelant a besoin d'une autorisation IAM pour appeler lambda:InvokeFunction, et la fonction Lambda a besoin d'une politique basée sur les ressources autorisant cet appelant.
Erreurs de Configuration et de Contrainte de Ressources
Ces erreurs concernent les paramètres de l'environnement d'exécution définis et les limites de ressources imposées à la fonction.
Erreurs de Délai d'Attente de la Fonction
Un dépassement de délai d'attente de fonction est un échec courant, indiquant que l'exécution a dépassé le temps maximum alloué. Lambda mettra fin de force à l'exécution et enregistrera une erreur Task timed out.
Diagnostic :
- Vérifiez la ligne
REPORTdans les logs CloudWatch. Regardez laDurationpar rapport au délai d'attente configuré. - Si la fonction expire tôt (par exemple, après 5 secondes pour une limite de 30 secondes), le goulot d'étranglement est probablement l'initialisation ou la connectivité (par exemple, en attendant une recherche DNS).
Correctifs :
- Augmenter le Délai d'Attente : Si la tâche est intrinsèquement longue (par exemple, traitement de grandes données), augmentez le délai d'attente (jusqu'à 15 minutes).
- Optimiser le Code/Les Dépendances : Si la tâche est lente, profilez le code pour identifier les goulots d'étranglement. Assurez-vous que les appels externes ont des délais d'attente raisonnables définis dans le code.
- Gérer les Départs à Froid : Les grands processus d'initialisation peuvent contribuer aux dépassements de délai. Utilisez la simultanéité provisionnée Lambda si les départs à froid sont critiques.
Erreurs d'Épuisement de la Mémoire
Si votre fonction nécessite plus de RAM que celle allouée, elle plantera et enregistrera un OutOfMemoryError ou un message similaire, selon l'environnement d'exécution.
Diagnostic : Examinez la métrique Max Memory Used dans la ligne REPORT de CloudWatch. Si cette valeur est constamment proche ou égale à la Memory Size configurée, vous avez peut-être une fuite de mémoire ou des ressources insuffisantes.
Correctif : Augmentez l'allocation mémoire et testez à nouveau. Lambda alloue plus de CPU à mesure que vous allouez plus de mémoire, donc une mémoire plus élevée peut parfois réduire suffisamment la durée pour compenser une partie du coût. Mesurez votre propre fonction au lieu de supposer qu'elle sera moins chère.
AWS Lambda Power Tuning peut aider à comparer les paramètres de mémoire pour une charge de travail spécifique.
Mauvaise Configuration du Gestionnaire (Runtime.HandlerNotFound)
Cela se produit lorsque Lambda ne peut pas localiser le point d'entrée défini dans la configuration de la fonction.
Symptôme : Error: Runtime.HandlerNotFound ou un échec de démarrage similaire.
Correctif : Vérifiez que le champ Handler dans les paramètres de la fonction correspond à la structure : [nom_fichier].[nom_fonction]. Par exemple, une fonction Python définie dans mon_code.py avec la fonction d'entrée lambda_handler doit avoir le gestionnaire défini sur mon_code.lambda_handler.
Pour Node.js, les noms de gestionnaire suivent le module et la fonction exportée, comme index.handler pour une fonction handler exportée dans index.js.
Problèmes de Réseau et de Connectivité VPC
Lorsqu'une fonction Lambda est configurée pour s'exécuter dans un Cloud Privé Virtuel (VPC), elle accède aux ressources privées mais perd l'accès à Internet public par défaut.
Absence d'Accès Internet
Si votre Lambda est dans un VPC et doit se connecter à des services externes, elle a besoin d'une route vers Internet via une passerelle NAT ou une autre voie de sortie approuvée. Placer la fonction dans un sous-réseau public ne lui donne pas d'adresse IP publique.
Symptôme : Échecs de connexion HTTP, dépassements de délai lors de l'accès aux points de terminaison publics.
Correctifs :
- Vérifiez que la fonction est attachée à des sous-réseaux privés destinés aux charges de travail Lambda.
- Assurez-vous que ces sous-réseaux privés ont une entrée de table de routage dirigeant le trafic Internet sortant (
0.0.0.0/0) vers une passerelle NAT. - Si la Lambda a uniquement besoin d'accéder aux services AWS de manière privée, envisagez les points de terminaison VPC tels que les points de terminaison de passerelle pour S3 et DynamoDB ou les points de terminaison d'interface pour les services pris en charge.
Restrictions des Groupes de Sécurité et des ACL Réseau
Votre fonction peut démarrer avec succès mais se bloquer lorsque son groupe de sécurité, le groupe de sécurité cible, l'ACL réseau ou la table de routage bloque la connexion.
Correctif : autorisez le trafic sortant du groupe de sécurité Lambda vers le port cible et autorisez le trafic entrant sur le groupe de sécurité cible depuis le groupe de sécurité Lambda. Par exemple, une fonction Lambda se connectant à PostgreSQL nécessite le TCP sortant 5432 depuis Lambda et le TCP entrant 5432 côté base de données.
Si le rôle d'exécution ne dispose pas des autorisations EC2 d'interface réseau requises pour l'accès VPC, Lambda peut échouer lors de la préparation de la mise en réseau VPC nécessaire à l'exécution de la fonction.
Déploiement et Mauvaise Configuration de l'Environnement d'Exécution
Ces problèmes concernent la structure du bundle de code ou l'environnement d'exécution choisi.
Erreurs de Dépendances et de Paquets
Si votre code repose sur des bibliothèques externes qui n'ont pas été correctement regroupées ou installées pour l'environnement d'exécution spécifique, la fonction échouera lors de l'initialisation.
Symptôme : Exceptions d'exécution comme module not found, cannot import name ou No such file or directory (particulièrement courant en Python ou Node.js).
Correctifs :
- Environnement Local vs. Lambda : Assurez-vous de construire les dépendances dans un environnement correspondant à l'environnement d'exécution Lambda (par exemple, utilisez
pip install -t .pour Python afin de placer correctement les dépendances). - Utiliser les Calques Lambda : Empaquetez les dépendances plus grandes et stables dans des calques Lambda pour réduire la taille du package de déploiement principal et améliorer la vitesse de déploiement.
- Vérifier le Chemin : Assurez-vous que votre configuration d'exécution pointe correctement vers l'emplacement des dépendances installées.
Taille et Format du Package de Déploiement
Lambda a des limites de taille de package de déploiement, et ces limites diffèrent selon que vous téléchargez un fichier .zip directement, téléchargez via Amazon S3, utilisez des calques ou déployez une image de conteneur. Vérifiez les quotas Lambda actuels pour votre méthode d'empaquetage avant de restructurer une grande fonction.
Symptôme : Le déploiement échoue avec une erreur de taille, ou un package volumineux contribue à des départs à froid plus lents.
Correctifs :
- Élagage : Supprimez les fichiers inutiles, la documentation et les dépendances de développement.
- Calques : Déplacez les actifs statiques ou les dépendances volumineuses vers des calques Lambda.
- Images de Conteneur : Pour les très grandes applications, envisagez de déployer la fonction en tant qu'image de conteneur depuis Amazon ECR.
Problèmes d'Événement et de Charge Utile
Certains échecs d'invocation proviennent de l'événement lui-même :
- JSON Mal Formé : Les tests console et les invocations CLI nécessitent des charges utiles JSON valides.
- Forme d'Événement Inattendue : Un événement S3, un événement API Gateway et un événement EventBridge n'ont pas les mêmes champs.
- Comportement de Nouvelle Tentative Asynchrone : Les invocations asynchrones peuvent réessayer après des échecs et peuvent envoyer les événements échoués vers une destination ou une file d'attente de lettres mortes si configuré.
Pour un test CLI direct, capturez la réponse et les logs :
aws lambda invoke \
--function-name ma-fonction \
--payload '{"ping": true}' \
--cli-binary-format raw-in-base64-out \
response.json
L'option --cli-binary-format raw-in-base64-out est couramment nécessaire avec AWS CLI v2 lors du passage de JSON brut directement sur la ligne de commande.
Résumé des Étapes de Dépannage
Lorsque vous rencontrez une erreur d'invocation, suivez cette approche systématique :
- Vérifiez CloudWatch en Premier : Recherchez les erreurs immédiates enregistrées par le service Lambda avant la ligne
START. - Vérifiez le Rôle IAM : Assurez-vous que le rôle d'exécution de la fonction dispose de toutes les autorisations requises (journalisation, VPC et accès aux services).
- Examinez la Configuration : Vérifiez le nom du gestionnaire, le paramètre de mémoire et la limite de délai d'attente.
- Analysez les Paramètres VPC : Si vous utilisez un VPC, vérifiez les groupes de sécurité, les mappages de sous-réseaux et les tables de routage (en particulier pour l'accès à la passerelle NAT).
- Examinez les Dépendances : Confirmez que toutes les bibliothèques nécessaires sont correctement empaquetées et accessibles par l'environnement d'exécution.
Une fois que vous savez si l'échec s'est produit avant l'invocation, pendant le démarrage de l'environnement d'exécution ou dans votre code, le correctif devient beaucoup plus ciblé. Vérifiez les logs en premier, prouvez l'identité IAM active et la politique de ressource, puis ajustez le gestionnaire, le package, le délai d'attente, la mémoire et les paramètres VPC en fonction de l'erreur spécifique que vous voyez.