Comment puis-je résoudre les erreurs que je reçois lorsque j'intègre API Gateway à une fonction Lambda ?

Lecture de 7 minute(s)
0

Je souhaite résoudre les erreurs que je reçois lorsque j'intègre Amazon API Gateway à une fonction AWS Lambda.

Résolution

Activer la journalisation pour votre API et votre étape

1.    Dans la console API Gateway, recherchez Éditeur d’étape pour votre API.

2.    Dans le panneau Éditeur d'étape, choisissez l'onglet Journaux/Suivi.

3.    Dans l'onglet Journaux/Suivi, sous Paramètres CloudWatch, procédez comme suit pour l'activation de la journalisation :
Cochez la case Enable CloudWatch Logs (Activer CloudWatch Logs).
Pour Niveau de journalisation, choisissez INFO pour générer des journaux pour toutes les demandes. Ou choisissez ERROR pour ne générer des journaux que pour les demandes envoyées à votre API qui entraînent une erreur.
Pour les API REST, cochez la case Consigner les demandes complètes/données de réponse. Ou, pour les API WebSocket, cochez la case Consigner toutes les données de messages.

4.    Sous Journalisation des accès personnalisée, procédez de la manière suivante pour activer la journalisation des accès :
Cochez la case Activer la journalisation des accès.
Pour ARN de destination des journaux d'accès, saisissez l'Amazon Resource Name (ARN) d'un Groupe de journaux CloudWatch ou d'un flux Amazon Kinesis Data Firehose.
Saisissez un Format de journal. Pour obtenir des conseils, choisissez CLF, JSON, XML, ou CSV pour voir un exemple dans ce format.

5.    Sélectionnez Enregistrer les modifications.
Remarque : la console ne confirme pas que les paramètres sont enregistrés.

Pour plus d'informations, consultez Configuration de la journalisation des API CloudWatch en utilisant la console API Gateway.

Déterminer les types d'intégration, vérifier les erreurs et passer aux étapes suivantes

1.    Déterminez si une intégration de proxy Lambda ou une intégration personnalisée Lambda est configurée dans API Gateway. Vous pouvez vérifier le type d'intégration en consultant la sortie de la fonction Lambda ou en exécutant la commande get-integration.

2.    Vérifiez que les erreurs dans API Gateway correspondent aux erreurs dans Lambda. Exécutez la requête CloudWatch Logs Insights suivante pour trouver un code d'état d'erreur pendant une période donnée :

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

Exécutez ensuite la requête CloudWatch Logs Insights suivante pour rechercher les journaux d'erreurs Lambda au cours de la même période :

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    En fonction du type d'erreur que vous identifiez dans vos journaux, choisissez l'une des options suivantes :

Si l'erreur suivante s'affiche, suivez les étapes de la section Résoudre les problèmes de simultanéité.

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

Si l'une des erreurs suivantes s'affiche, suivez les étapes de la section Résoudre les problèmes de délais d’expiration.

Pour une intégration personnalisée Lambda :

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Pour une intégration proxy Lambda :

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Si l'erreur suivante s'affiche, suivez les étapes de la section Résoudre les erreurs de fonction.

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

Résoudre les problèmes de simultanéité

Vous recevez 429 erreurs de limitation ou 500 erreurs lorsque des requêtes supplémentaires proviennent d’API Gateway à un rythme supérieur à celui que peut adopter votre fonction Lambda.

Pour résoudre ces erreurs, analysez dans CloudWatch les métriques Count (API Gateway), Throttles (Lambda) et ConcurrentExecutions (Lambda). Tenez compte des éléments suivants :

  • Count (API Gateway) est le nombre total de requêtes d'API dans une période donnée.
  • Les throttles (Lambda) sont le nombre de requêtes d'appel qui sont soumises à une limitation. Lorsque toutes les instances de fonction traitent des requêtes et qu'aucune simultanéité n'est disponible pour la mise à l'échelle, Lambda rejette les requêtes supplémentaires avec l'erreur TooManyRequestsException. Les requêtes avec limitation et autres erreurs d'appel ne comptent pas comme des appels ou des erreurs.
  • ConcurrentExecutions (Lambda) est le nombre d'instances de fonction qui traitent des événements. Si ce nombre atteint votre quota d'exécutions simultanées pour la région AWS, les demandes d'invocation supplémentaires sont limitées. Les demandes d'invocation sont également limitées lorsque le nombre d'instances de fonction atteint la limite de concurrence réservée que vous avez configurée pour la fonction.

Remarque : pour plus d'informations, consultez Métriques de la passerelle API et Utilisation des mesures de fonction Lambda.

Si vous définissez la simultanéité réservée dans votre fonction Lambda, choisissez une valeur de simultanéité réservée plus élevée pour la fonction Lambda. Ou supprimez la valeur de simultanéité réservée de la fonction Lambda. La fonction exploite alors le pool d'exécutions simultanées non réservées.

Si vous ne définissez pas la simultanéité réservée dans la fonction Lambda, vérifiez la métrique ConcurrentExecutions (Exécutions simultanées) pour déterminer l'utilisation. Pour plus d'informations, consultez Quotas Lambda.

Résoudre les problèmes de délai d’expiration

Le délai d’expiration d'intégration est de 29 secondes (limite stricte) pour toutes les intégrations API Gateway. Vous pouvez rencontrer deux scénarios lorsque vous créez une API API Gateway avec intégration Lambda. Les scénarios se produisent lorsque le délai d'expiration est inférieur ou supérieur à 29 secondes.

Si le délai d'expiration de votre fonction Lambda est inférieur à 29 secondes, vérifiez vos journaux Lambda pour examiner ce problème. Si votre fonction Lambda doit s'exécuter après 29 secondes, envisagez d'appeler la fonction Lambda de manière asynchrone.

Pour l'intégration personnalisée Lambda, procédez comme suit :

1.    Ouvrez la console API Gateway.

2.    Dans le volet de navigation, choisissez API, puis sélectionnez votre API.

3.    Sélectionnez Ressources, puis choisissez votre méthode.

4.    Sélectionnez Demande d'intégration.

5.    Sélectionnez Demande de méthode.

6.    Développez En-têtes HTTP.

7.    Ensuite, sélectionnez Ajouter un en-tête.

8.    Pour Nom, saisissez un nom pour votre en-tête. Par exemple : X-Amz-Invocation-Type

Important : vous devez mapper votre en-tête à partir de 'Event' (les guillemets simples sont obligatoires).

Pour l'intégration proxy Lambda :

Utilisez deux fonctions Lambda : les fonctions A et B. API Gateway appelle d'abord la fonction A de manière synchrone. Ensuite, la fonction A appelle la fonction B de manière asynchrone. La fonction A peut renvoyer une réponse réussie à API Gateway lorsque la fonction B est invoquée de manière asynchrone.

Si vous utilisez l'intégration proxy Lambda, envisagez de la remplacer par une intégration personnalisée. Toutefois, vous devez configurer les modèles de mappage pour transformer la demande/réponse en format souhaité. Pour plus d'informations, consultez Configurer l'appel asynchrone de la fonction Lambda backend.

Remarque : étant donné qu'une fonction Lambda asynchrone s'exécute en arrière-plan, votre client ne peut pas recevoir directement de données à partir d'une fonction Lambda. Vous devez disposer d'une base de données intermédiaire pour stocker les données persistantes.

Résolution des erreurs de fonction

Si vous recevez une erreur de fonction lorsque vous appelez votre API, vérifiez que votre fonction Lambda ne présente aucune erreur de syntaxe. Cette erreur est également visible si votre fonction Lambda ne renvoie pas un objet JSON valide attendue par la passerelle API pour les intégrations proxy.

Pour la résolution de cette erreur, suivez les étapes de la section Activation de la journalisation pour votre API et votre étape.


Informations connexes

Gestion des erreurs Lambda standard dans API Gateway

Gestion des erreurs Lambda personnalisées dans API Gateway

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