AWS lambda passerelle api erreur "Incorrect Lambda proxy réponse"

j'essaie de mettre en place un exemple hello world avec AWS lambda et de le servir via api gateway. J'ai cliqué sur "Créer une fonction Lambda", qui a configuré l'api gatway et sélectionné L'option Blank Function. J'ai ajouté la fonction lambda trouvée sur guide de démarrage de passerelle AWS :

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

le problème, c'est que quand je fais une demande D'accès, elle renvoie une réponse 502 { "message": "Internal server error" } . Et les journaux disent: "L'exécution a échoué. en raison d'une erreur de configuration: mal formé Lambda proxy réponse".

41
demandé sur jjbskir 2017-04-30 18:23:59

9 réponses

habituellement, quand vous voyez Malformed Lambda proxy response , cela signifie que votre réponse de votre fonction Lambda ne correspond pas au format que la passerelle API attend, comme ceci

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

si vous n'utilisez pas Lambda proxy integration, vous pouvez vous connecter à la console de passerelle API et décocher la case Lambda proxy integration.

aussi, si vous voyez intermittent Malformed Lambda proxy response , cela pourrait signifier que la demande à votre fonction Lambda a été étranglée par Lambda, et vous devez demander une augmentation de limite d'exécution simultanée sur la fonction Lambda.

52
répondu Ka Hou Ieong 2017-07-19 20:32:48

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

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

Note : le corps doit être strié

27
répondu selftaught91 2017-06-22 14:34:44

Oui donc je pense que c'est parce que vous ne retournez pas vraiment une réponse http correcte là-bas ce qui explique pourquoi vous obtenez l'erreur.

personnellement, j'utilise un ensemble de fonctions comme:

    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.

alors vous faites tout simplement:

var responder = require('responder')

// some code

callback(null, responder.success({ message: 'hello world'}))
17
répondu Mrk Fldig 2017-05-01 12:15:43

From the AWS docs

dans une fonction Lambda dans un noeud.js, Pour renvoyer une réponse en cas de succès, appel rappel(null, {"statusCode": 200, "carrosserie": "résultats"}). Pour jeter un exception, call Call callback (Nouvelle erreur ('internal server error')). 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.

5
répondu Jonathan 2017-09-08 10:14:37

un cas très très spécial, si vous passez les en-têtes directement Il ya une chance que vous avez cet en-tête:

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

mais Amazon a besoin de ceci:

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

2
répondu Miguel 2018-05-10 04:39:41

j'ai eu cette erreur parce que j'ai accidentellement supprimé la variable ServerlessExpressLambdaFunctionName de la ressource CloudFormation AWS::Serverless::Api. Le contexte ici est https://github.com/awslabs/aws-serverless-express " exécutez des applications sans serveur et reposez APIs en utilisant votre noeud existant.js cadre d'application, sur AWS Lambda et Amazon API Gateway"

1
répondu Mark 2017-11-27 22:42:56

dans le cas où ce qui précède ne fonctionne pour personne, je suis tombé dans cette erreur malgré le réglage de la variable de réponse correctement.

je faisais un appel à une base de données RDS dans ma fonction. Il s'est avéré que ce qui causait le problème était les règles du groupe de sécurité (entrant) sur cette base de données.

vous voudrez probablement restreindre les adresses IP qui peuvent accéder à L'API, mais si vous voulez le faire fonctionner rapidement / sale pour tester si ce changement vous pouvez le définir pour accepter tout comme cela (vous pouvez aussi définir la portée sur les ports pour accepter tous les ports aussi, mais je ne l'ai pas fait dans cet exemple):

enter image description here

0
répondu abe732 2018-06-22 00:45:56

pour tous ceux qui luttent quand la réponse semble valide. Cela ne fonctionne pas:

callback(null,JSON.stringify( {
  isBase64Encoded: false,
  statusCode: 200,
  headers: { 'headerName': 'headerValue' },
  body: 'hello world'
})

mais ce n':

callback(null,JSON.stringify( {
  'isBase64Encoded': false,
  'statusCode': 200,
  'headers': { 'headerName': 'headerValue' },
  'body': 'hello world'
})

de plus, il semble qu'aucune touche supplémentaire ne soit autorisée sur l'objet de réponse.

0
répondu Ciryon 2018-07-09 14:01:21

si vous utilisez Go avec https://github.com/aws/aws-lambda-go , vous devez utiliser events.APIGatewayProxyResponse .

func hello(ctx context.Context, event ImageEditorEvent) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{
        IsBase64Encoded: false,
        StatusCode:      200,
        Headers:         headers,
        Body:            body,
    }, nil
}
0
répondu Kohei Mikami 2018-07-19 15:03:31