148 votes

Erreur de passerelle AWS lambda api "Réponse du proxy Lambda mal formé"

Je suis en train de mettre en place un exemple hello world avec AWS lambda et de le servir par le biais de la passerelle api. J'ai cliqué sur "Créer une Fonction Lambda", qui a mis en place l'api gatway et sélectionné le Vide en Fonction de l'option. J'ai ajouté la fonction lambda trouvé sur AWS passerelle guide de mise en route:

exports.handler = function(event, context, callback) {
  callback(null, {"Hello":"World"});  // SUCCESS with message
};

Le problème est que lorsque je fais une requête GET pour elle, c'est de retourner une réponse 502 { "message": "Internal server error" }. Et les journaux de dire "échec de l'Exécution en raison d'une erreur de configuration: mal formé Lambda proxy réponse".

191voto

Ka Hou Ieong Points 2168

Habituellement, lorsque vous voyez Malformed Lambda proxy response, cela signifie que votre réponse à partir de votre fonction Lambda ne correspond pas au format de la Passerelle API attend, comme ceci

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

Si vous n'êtes pas en utilisant la Lambda proxy intégration, vous pouvez vous connecter à la Passerelle API console et décochez la Lambda proxy intégration de case à cocher.

Aussi, si vous voyez des intermittents Malformed Lambda proxy response, il pourrait signifier la demande à votre fonction Lambda a été étranglé par un Lambda, et il vous faudra demander à un concurrent à l'exécution de l'augmentation de la limite sur la fonction Lambda.

80voto

selftaught91 Points 2392

Si lambda est utilisé comme proxy, le format de réponse devrait être

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

Note: Le corps devrait être stratifié

31voto

Mrk Fldig Points 1131

Ouais, alors je pense que c'est parce que vous ne renvoyez pas une réponse http appropriée, ce qui explique pourquoi vous obtenez l'erreur.

Personnellement, j'utilise un ensemble de fonctions telles que:

     module.exports = {
        success: (result) => {
            return {
                statusCode: 200,
                headers: {
                    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                },
                body: JSON.stringify(result),
            }
        },
        internalServerError: (msg) => {
            return {
                statusCode: 500,
                headers: {
                    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                },
                body: JSON.stringify({
                    statusCode: 500,
                    error: 'Internal Server Error',
                    internalError: JSON.stringify(msg),
                }),
            }
        }
} // add more responses here.
 

Ensuite, vous faites simplement:

 var responder = require('responder')

// some code

callback(null, responder.success({ message: 'hello world'}))
 

7voto

Jonathan Points 3225

À partir de l' AWS docs

Dans une fonction Lambda dans Node.js Pour retourner une réponse en cas de succès, appel rappel(null, {"statusCode": 200, "carrosserie": "résultats"}). Pour jeter un exception, appel le rappel(new Error('erreur interne du serveur)). Pour un côté client d'erreur, par exemple, un paramètre requis est manquant, vous pouvez appeler rappel(null, {"statusCode": 400, "carrosserie": "paramètres Manquants de ..."}) renvoie l'erreur sans lancer une exception.

4voto

Miguel Points 21

Un cas très très spécial, si vous passez directement les en-têtes, il y a une chance que vous ayez cet en-tête:

"set-cookie": [ "........" ]

Mais Amazon a besoin de ceci:

"set-cookie": "[ \\"........\\" ]"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X