Comment résoudre les erreurs HTTP 502 « Réponse de proxy Lambda malformée » à partir des API Gateway REST API ?

Date de la dernière mise à jour : 18/11/2021

J'ai configuré l'intégration proxy 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 ?

Brève description

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

Exemple de message d'erreur HTTP 502 « Réponse de proxy Lambda mal formée » tel qu'il apparaît dans les Amazon CloudWatch Logs

Thu Dec 08 01:13:00 UTC 2016 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Dec 08 01:13:00 UTC 2016 : 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.    Testez votre méthode d'API REST dans la console 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.