Comment puis-je résoudre les erreurs de la passerelle API « malformed Lambda proxy response » ou de codes d'état 502 ?

Dernière mise à jour : 30/10/2020

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

Brève description

Le format de la réponse de la fonction Lambda est souvent la source de ces erreurs. Si le format constitue le problème, alors vous voyez un message semblable à celui-ci dans les journaux :

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 que la passerelle API puisse gérer la réponse d'une fonction Lambda, la réponse doit être JSON dans ce format :

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

Résolution

  1. Examinez la sortie de journalisation à partir de la console de passerelle API , ou affichez les événements de journalisation de la passerelle API 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 JSON dans le format approprié, alors, reformatez-la.

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

exports.handler = (event, context, callback) => {

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

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

Remarque : si votre fonction est écrite dans un autre langage de programmation, reportez-vous à la référence de programmation de ce langage. Confirmez que la fonction renvoie une réponse dans le format approprié.

Dans cette réponse, se trouvent quatre champs : statusCode, en-têtes, corps et isBase64Encoded.

  • Le statusCode est un nombre entier interprété par la passerelle API qui est renvoyé au mandataire de la méthode API.
  • Les en-têtes sont collectées puis renvoyées avec la réponse de la passerelle API.
  • Le champ corps, si vous restituez JSON, doit être converti en chaîne de caractères pour éviter tout autre problème avec la réponse. Utilisez JSON.stringify pour gérer cela dans les fonctions Node.js. D'autres environnements d'exécution nécessitent des solutions différentes, mais le concept est le même.
  • Le champ isBase64Encoded est important si vous travaillez avec des données binaires. Si vous n'utilisez pas ce champ, il est recommandé de définir ce champ sur une valeur booléenne FALSE.