Comment résoudre les erreurs HTTP 502 provenant des API REST d’API Gateway avec l’intégration de proxy Lambda ?

Dernière mise à jour : 08/08/2022

J'ai configuré l'intégration proxy d’Amazon API Gateway pour fonctionner avec une fonction AWS Lambda. Lorsque j'appelle mon REST API, je reçois une erreur de configuration et un code d'état HTTP 502. Comment puis-je résoudre ce problème ?

Courte description

Si la réponse de votre fonction Lambda à la demande d'API n'est pas correctement formatée, l’API Gateway renvoie un code d'état HTTP 502.

Exemples de messages d'erreur HTTP 502 tels qu'ils apparaissent dans Amazon CloudWatch Logs

Wed Aug 03 08:10:00 UTC 2022 : Execution failed due to configuration error: 
WE Aug 03 09:10:00 UTC 2022 : Method completed with status: 502

-ou-

Wed Aug 03 08:20:33 UTC 2022 : Lambda execution failed with status 200 due to customer function error: [Errno 13] Permission denied: '/var/task/lambda_function.py'. Lambda request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Wed Aug 03 08:20:33 UTC 2022 : Method completed with status: 502

Pour qu’API Gateway puisse traiter la réponse d'une fonction Lambda, cette dernière doit renvoyer la sortie au format JSON suivant :

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

Résolution

1.    Consultez les métriques CloudWatch de votre API REST avec le tableau de bord de l'API dans API Gateway.
-ou-
Consultez les événements du journal de votre API REST dans la console Amazon CloudWatch.

2.    Dans les journaux, vérifiez le format de la réponse de votre fonction Lambda à votre API. Si la réponse n'est pas au format JSON requis, reformatez-la.

3.    Vérifiez que la stratégie de ressources de la fonction Lambda autorise l'accès pour appeler la fonction avec API Gateway.

4. Si l'exécution de la fonction Lambda échoue en raison d'un problème d'autorisation de package, vérifiez les autorisations. Comment dépanner les erreurs « permission denied » (autorisation refusée) ou « unable to import module » (impossible d'importer le module) lors du chargement d'un package de déploiement Lambda ?

5.    Vérifiez que le nom et la configuration du gestionnaire de fonctions Lambda sont valides.

6.    Si l'exécution Lambda échoue pendant l'exécution, consultez les journaux de la fonction Lambda et mettez le code à jour.

7.    Après avoir apporté vos modifications, vous pouvez tester votre méthode d'API REST dans la console d’API Gateway.

Exemple de fonction Lambda Node.js avec la réponse correctement formatée

Remarque : les fonctions Lambda Node.js prennent en charge les gestionnaires asynchrones et les gestionnaires non asynchrones. L'exemple de fonction suivant utilise un gestionnaire asynchrone.

exports.handler = async (event) => {

    const responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    const response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };

    return response;
};

Dans cet exemple de réponse, il existe quatre champs :

  • statusCode est un nombre entier interprété par API Gateway qui est renvoyé à l'appelant de la méthode API.
  • headers sont collectées puis renvoyées avec la réponse de l'API Gateway.
  • body doit être converti en chaîne si vous renvoyez des données au format JSON.
    Remarque : vous pouvez utiliser JSON.stringify pour traiter cette tâche dans les fonctions Node.js. D'autres environnements d'exécution nécessitent des solutions différentes, toutefois le concept est le même.
  • isBase64Encoded est un champ obligatoire si vous utilisez des données binaires. Si vous n'utilisez pas ce champ, la bonne pratique est de définir la valeur sur FALSE.

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?