pricing node example aws node.js amazon-web-services aws-lambda aws-api-gateway

node.js - node - Error de puerta de enlace de la API de AWS lambda "Respuesta de proxy Lambda con formato incorrecto"



lambda proxy integration (11)

Estoy tratando de configurar un ejemplo hello world con AWS lambda y servirlo a través de la puerta de enlace api. Hice clic en "Crear una función Lambda", que configuró la API gatway y seleccioné la opción Función en blanco. Agregué la función lambda que se encuentra en la guía de inicio de AWS Gateway :

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

El problema es que cuando le hago una solicitud GET, me devuelve una respuesta 502 { "message": "Internal server error" } . Y los registros dicen "La ejecución falló debido a un error de configuración: respuesta de proxy Lambda mal formada".


De los documentos de AWS

En una función Lambda en Node.js, para devolver una respuesta exitosa, llame a la devolución de llamada (nulo, {"statusCode": 200, "body": "results"}). Para lanzar una excepción, llame a la devolución de llamada (nuevo error (''error interno del servidor'')). Para un error del lado del cliente, por ejemplo, falta un parámetro requerido, puede llamar a la devolución de llamada (nulo, {"statusCode": 400, "body": "Faltan parámetros de ..."}) para devolver el error sin arrojar un excepción.


En caso de que lo anterior no funcione para nadie, me encontré con este error a pesar de configurar la variable de respuesta correctamente.

Estaba haciendo una llamada a una base de datos RDS en mi función. Resultó que lo que estaba causando el problema eran las reglas del grupo de seguridad (entrantes) en esa base de datos.

Probablemente desee restringir las direcciones IP que pueden acceder a la API, pero si desea que funcione de manera rápida / sucia para probar si ese cambio lo soluciona, puede configurarlo para que acepte todo de esa manera (también puede configurar el rango en los puertos para aceptar todos los puertos también, pero no hice eso en este ejemplo):


He intentado todas las sugerencias anteriores, pero no funciona mientras body valor body no es String

return { statusCode: 200, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, body: JSON.stringify({ success: true }), isBase64Encoded: false };


Para Python3:

import json def lambda_handler(event, context): return { ''statusCode'': 200, ''headers'': { ''Content-Type'': ''application/json'', ''Access-Control-Allow-Origin'': ''*'' }, ''body'': json.dumps({ ''success'': True }), "isBase64Encoded": False }

Tenga en cuenta que no es necesario configurar el body , solo puede estar vacío:

''body'': ''''


Para cualquier otra persona que tenga dificultades cuando la respuesta parezca válida. Esto no funciona:

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

pero esto hace:

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

Además, parece que no se permiten claves adicionales en el objeto de respuesta.


Por lo general, cuando ve una Malformed Lambda proxy response , significa que su respuesta de su función Lambda no coincide con el formato que espera API Gateway, como este

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

Si no está utilizando la integración de proxy Lambda, puede iniciar sesión en la consola API Gateway y desmarcar la casilla de verificación Integración de proxy Lambda.

Además, si está viendo una Malformed Lambda proxy response intermitente, puede significar que Lambda ha estrangulado la solicitud a su función Lambda, y debe solicitar un aumento simultáneo del límite de ejecución de la función Lambda.


Sí, así que creo que esto se debe a que en realidad no está devolviendo una respuesta http adecuada, por eso está recibiendo el error.

personalmente uso un conjunto de funciones de esta manera:

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.

Entonces simplemente haces:

var responder = require(''responder'') // some code callback(null, responder.success({ message: ''hello world''}))


Si está utilizando Go con https://github.com/aws/aws-lambda-go , debe usar events.APIGatewayProxyResponse .

func hello(ctx context.Context, event ImageEditorEvent) (events.APIGatewayProxyResponse, error) { return events.APIGatewayProxyResponse{ IsBase64Encoded: false, StatusCode: 200, Headers: headers, Body: body, }, nil }


Si se usa lambda como proxy, el formato de respuesta debe ser

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

Nota: el cuerpo debe estar encadenado


Tuve este error porque eliminé accidentalmente la variable ServerlessExpressLambdaFunctionName del recurso CloudFormation AWS :: Serverless :: Api. El contexto aquí es https://github.com/awslabs/aws-serverless-express "Ejecute aplicaciones sin servidor y API REST utilizando su marco de aplicación Node.js existente, además de AWS Lambda y Amazon API Gateway"


Un caso muy muy especial, si pasa los encabezados directamente, existe la posibilidad de que tenga este encabezado:

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

Pero Amazon necesita esto:

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