Por ejemplo, si quiero devolver un error 400 específico para parámetros no válidos o quizás un 201 cuando la llamada a la función lambda dio como resultado un create.
Me gustaría tener diferentes códigos de estado http, pero parece que la puerta de enlace api siempre devuelve un código de estado 200 incluso si la función lambda devuelve un error.
amazon-web-services
aws-lambda
aws-api-gateway
MonoBonkey
fuente
fuente
Respuestas:
Actualización por 20-9-2016
Amazon finalmente hizo esto fácil usando la integración de Lambda Proxy . Esto permite que su función Lambda devuelva códigos HTTP y encabezados adecuados:
¡Diga adiós a la asignación de solicitudes / respuestas en API Gateway!
opcion 2
Integre una aplicación Express existente con Lambda / API Gateway utilizando aws-serverless-express .
fuente
callback
estilo. Solo hazlocallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Esta es la forma más rápida de devolver códigos de estado HTTP personalizados y uno personalizado
errorMessage
:En el panel de API Gateway, haga lo siguiente:
Agregue una respuesta de integración para cada uno de los códigos de estado HTTP que creó anteriormente. Asegúrese de que el paso de entrada esté marcado. Use la expresión regular de error lambda para identificar qué código de estado debe usarse cuando devuelva un mensaje de error de su función lambda. Por ejemplo:
Su ruta de API Gateway debería devolver esto:
No veo forma de copiar estas configuraciones y reutilizarlas para diferentes métodos, ¡así que tenemos muchas entradas manuales redundantes y molestas que hacer!
Mis respuestas de integración se ven así:
fuente
return context.fail(new Error('bad one'))
Para poder devolver un objeto de error personalizado como JSON, debe pasar por un par de aros.
Primero, debe fallar el Lambda y pasarle un objeto JSON en cadena:
A continuación, configura el mapeo de expresiones regulares para cada uno de los códigos de estado que le gustaría devolver. Usando el objeto que definí anteriormente, configuraría esta expresión regular para 400:
. * "estado": 400. *
Finalmente, configura una plantilla de mapeo para extraer la respuesta JSON de la propiedad errorMessage devuelta por Lambda. La plantilla de mapeo se ve así:
$ input.path ('$. errorMessage')
Escribí un artículo sobre esto que entra en más detalles y explica el flujo de respuesta de Lambda a API Gateway aquí: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -y-código-de-estado-de-api-gateway-with-lambda /
fuente
1) Configure su recurso de API Gateway para usar la integración de proxy de Lambda marcando la casilla de verificación etiquetada "Usar integración de proxy de Lambda" en la pantalla "Solicitud de integración" de la definición de recurso de API Gateway. (O defínalo en su configuración de cloudformation / terraform / serverless / etc)
2) Cambie su código lambda de 2 formas
event
(argumento de la primera función) de forma adecuada. Ya no es solo la carga útil básica, representa la solicitud HTTP completa, incluidos los encabezados, la cadena de consulta y el cuerpo. Muestra a continuación. El punto clave es que los cuerpos JSON serán cadenas que requieren unaJSON.parse(event.body)
llamada explícita (no se olvide detry/catch
eso). A continuación se muestra un ejemplo.statusCode
, incluidosbody
, yheaders
.body
debe ser una cuerda, así que haz lo queJSON.stringify(payload)
sea necesariostatusCode
puede ser un númeroheaders
es un objeto de nombres de encabezado a valoresEjemplo de argumento de evento Lambda para la integración de proxy
Forma de respuesta de devolución de llamada de muestra
Notas : creo que los métodos de
context
tales comocontext.succeed()
están en desuso. Ya no están documentados aunque todavía parecen funcionar. Creo que codificar la API de devolución de llamada es lo correcto en el futuro.fuente
Quería que un error de Lambda fuera el error 500 correcto, después de investigar mucho, se me ocurrió lo siguiente, que funciona:
En LAMBDA
Para una buena respuesta, vuelvo de la siguiente manera:
Para una mala respuesta, regresando como se muestra a continuación.
En API Gateway
Para obtener un método GET, diga GET of / res1 / service1:
Luego,
Ahora, publique / res1 / service1, presione la URL publicada, que está conectada a lambda anterior
Si usó el complemento de Chrome del cliente REST avanzado (o Postman), verá los códigos http adecuados, como el error del servidor (500) o 400, en lugar del código de respuesta 200 http para todas las solicitudes que se dieron en "httpStatusCode".
Desde el 'Panel de control' de API, en API Gateway, podemos ver los códigos de estado http como se muestra a continuación:
fuente
La forma más sencilla de hacerlo es utilizar la integración LAMBDA_PROXY . Con este método, no es necesario que se establezcan transformaciones especiales en la canalización de API Gateway.
Su objeto de devolución tendría que ser similar al fragmento a continuación:
Tiene algunos inconvenientes: debe tener especial cuidado con el manejo de errores y acoplar su función lambda al punto final de API Gateway; Dicho esto, si realmente no lo vas a usar en ningún otro lugar, no es un gran problema.
fuente
Para aquellos que intentaron todo lo que hicieron en esta pregunta y no pudieron hacer que esto funcionara (como yo), revisen el comentario de thedevkit en esta publicación (me salvó el día):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Reproduciéndolo íntegramente a continuación:
fuente
Así es como se recomienda en un blog de AWS Compute si se usa API Gateway. Comprobando si la integración funciona con la invocación directa de Lambda.
Para las invocaciones directas de Lambda, esta parece ser la mejor solución para el análisis del lado del cliente.
fuente
Estoy usando 0.5 sin servidor. Así es como funciona, para mi caso
s-function.json:
handler.js:
fuente
Si no desea utilizar un proxy, puede utilizar esta plantilla:
fuente