Creé una función de AWS Lambda usando Python 3.8 con un disparador de Lambda Proxy API Gateway: 
De hecho, es posible devolver códigos de error HTTP personalizados:
def lambda_handler(event, context): return { 'statusCode': 400, 'body': json.dumps('This is a bad request!') }Sin embargo, algunos ejemplos en línea (por ejemplo, 1 , 2 ) simplemente generan una excepción para devolver el error con un mensaje personalizado. Si se lanza una excepción en el controlador como se muestra a continuación, el servidor devuelve un 502 ya que la respuesta no está en el formato esperado para la integración de proxy :
def lambda_handler(event, context): raise Exception('This is an exception!')Creo que los ejemplos se basan en algunas plantillas de respuesta de integración y no utilizan la integración de proxy. ¿Es posible lograr lo mismo con Lambda Proxy? Me gustaría evitar capturar excepciones globalmente en el controlador de Lambda para crear respuestas de error personalizadas.
DurandA: creo que tiene toda la razón: el enfoque simplificado de integración de Lambda Proxy se basa en que detecte sus excepciones y devuelva el formato estandarizado:
def lambda_handler(event, context): return { 'statusCode': 400, 'body': json.dumps('This is a bad request!') }La función de integración de Lambda Proxy simplificada se anunció en una publicación de blog de septiembre de 2016 , pero uno de los ejemplos que citó se publicó anteriormente, en una publicación de blog de junio de 2016 , cuando el método de respuesta de integración más complicado era la única forma. Tal vez te hayas topado con un ejemplo desactualizado.
También publicó un enlace a la documentación del producto para el manejo de errores , en la parte superior de la sección que cubre la función de integración de proxy de Lambda, dice:
Con la integración del proxy de Lambda, se requiere que Lambda devuelva una salida con el siguiente formato:
{ "isBase64Encoded" : "boolean", "statusCode": "number", "headers": { ... }, "body": "JSON string" }
Aquí hay un ejemplo de trabajo que devuelve un HTTP 400 con el mensaje "¡Esta es una excepción!" utilizando la integración de proxy Lambda.
import json def exception_handler(e): # exception to status code mapping goes here... status_code = 400 return { 'statusCode': status_code, 'body': json.dumps(str(e)) } def lambda_handler(event, context): try: raise Exception('This is an exception!') return { 'statusCode': 200, 'body': json.dumps('This is a good request!') } except Exception as e: return exception_handler(e)Salida de lo anterior:
$ http https://**********.execute-api.us-east-2.amazonaws.com/test HTTP/1.1 400 Bad Request Connection: keep-alive Content-Length: 23 Content-Type: application/json Date: Sun, 23 Feb 2020 05:06:59 GMT X-Amzn-Trace-Id: Root=1-********-************************;Sampled=0 x-amz-apigw-id: **************** x-amzn-RequestId: ********-****-****-****-************ "This is an exception!"Comprendo su frustración por no querer crear un controlador de excepciones personalizado. Afortunadamente, solo tiene que crear un solo controlador que envuelva su función lambda_handler. ¡Le deseamos todo lo mejor!
Hasta donde yo sé, el uso del lenguaje incorporado en Exceptions no funcionará porque API Gateway espera un formato de respuesta preciso, que es un JSON. Lo que puede hacer es generar la excepción para que pueda iniciar sesión en CloudWatch, pero luego envuélvalo dentro de un objeto JSON para que también pueda devolverlo al cliente si es necesario. Realmente creo que esto debería ser posible de inmediato, ya que con los servicios de ECS puede hacerlo (utilizo algunos servicios en .NET Core y cuando ocurre una excepción, obtengo el código de estado apropiado como respuesta, sin hacer trabajo adicional)
Para casos simples, el enfoque genérico de Chuck T. probablemente esté bien. Pero si tiene un flujo de trabajo complejo con varias funciones de Lambda coordinadas y una máquina de estado de AWS, puede usar una estrategia más flexible que se describe aquí .
class SecretAccessFailedException(Exception): pass.