Solicite las diferencias de serialización del cuerpo cuando se invoca la función lambda a través de la puerta de enlace API v la consola Lambda

Tengo una API simple configurada en AWS API Gateway. Está configurado para invocar una función lambda de Python 2.7 a través de la integración del proxy de la puerta de enlace API.

Cometí un error extraño porque la lambda funcionaba (procesaba el cuerpo correctamente y actualizaba una base de datos) cuando se invocaba localmente ya través de la consola de prueba de lambda, pero no a través de Curl o Postman.

Resulta que, cuando se invoca a través de la consola de pruebas lambda, el objeto de event['body'] se presenta como un dict . Cuando se llama a través de un cliente HTTP, se presenta como una cadena ( Unicode ).

Por supuesto, puedo evitarlo, pero me gustaría entenderlo, y también preferiría un objeto Python adecuado. También me gustaría poder usar la consola de prueba lambda, pero actualmente no puedo ya que pasa su entrada de manera diferente.

¿Hay algún cambio de configuración que me esté faltando, lo que obligará a la puerta de enlace de API a serializar el cuerpo de la solicitud (así como a todos los demás parámetros) como un dict Python o un objeto adecuado? La documentación sobre los detalles de lo que se pasa es escasa, indicando:

evento: AWS Lambda usa este parámetro para pasar los datos del evento al manejador. Este parámetro es generalmente del tipo dict de Python. También puede ser de tipo list, str, int, float o NoneType.

Entiendo que esta propaganda cubre lo que estoy viendo, pero no es exactamente útil.

Cuando invocas la lambda localmente o a través de la consola Lambda, invocas esa lambda directamente y tu lambda recibe exactamente lo que estás enviando.

Cuando lo invoca a través de la puerta de enlace API, la puerta de enlace API crea el objeto de event para usted según su solicitud HTTP. Agrega los encabezados HTTP, la ruta, las cadenas de consulta, la carga útil, etc.

Aquí hay un resumen de lo que está obteniendo como un event de una invocación de la puerta de enlace de la API:

 { "resource": "Resource path", "path": "Path parameter", "httpMethod": "Incoming request's method name" "headers": {Incoming request headers} "queryStringParameters": {query string parameters } "pathParameters": {path parameters} "stageVariables": {Applicable stage variables} "requestContext": {Request context, including authorizer-returned key-value pairs} "body": "A JSON string of the request payload." "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode" } 

Referencia: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

Como puede ver, el body se le enviará como una string que puede analizar utilizando json.loads() .