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".
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.
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é
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'}))
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.
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": "[ \"........\" ]"
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"
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):
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.
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
}