Errores de la función AWS Lambda en Java - AWS Lambda

Errores de la función AWS Lambda en Java

Cuando el código devuelve un error, Lambda genera una representación JSON de este. Este documento de error aparece en el registro de invocación y, en el caso de las invocaciones síncronas, en la salida.

Esta página describe cómo ver los errores de invocación de funciones Lambda para el tiempo de ejecución de Java utilizando la consola Lambda y AWS CLI.

Sintaxis

En el ejemplo siguiente, el entorno de ejecución no puede deserializar el evento en un objeto. La entrada es un tipo JSON válido, pero no coincide con el tipo que esperaba el método de controlador.

ejemplo Error del tiempo de ejecución de Lambda

{ "errorMessage": "An error occurred during JSON parsing", "errorType": "java.lang.RuntimeException", "stackTrace": [], "cause": { "errorMessage": "com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.lang.Integer from String value '1000,10': not a valid Integer value\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@35fc6dc4; line: 1, column: 1] (through reference chain: java.lang.Object[0])", "errorType": "java.io.UncheckedIOException", "stackTrace": [], "cause": { "errorMessage": "Can not construct instance of java.lang.Integer from String value '1000,10': not a valid Integer value\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@35fc6dc4; line: 1, column: 1] (through reference chain: java.lang.Object[0])", "errorType": "com.fasterxml.jackson.databind.exc.InvalidFormatException", "stackTrace": [ "com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:55)", "com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:907)", ... ] } } }

Cómo funciona

Al invocar una función Lambda, Lambda recibe la solicitud de invocación y valida los permisos de su rol de ejecución, comprueba que el documento de evento es un documento JSON válido y comprueba los valores de los parámetros.

Si la solicitud pasa la validación, Lambda envía la solicitud a una instancia de función. El entorno de Lambda tiempo de ejecución convierte el documento de evento en un objeto y lo pasa al controlador de funciones.

Si Lambda encuentra algún error, devuelve un tipo de excepción, mensaje y código de estado HTTP que indican la causa del error. El cliente o servicio que invocó la función Lambda puede manejar el error mediante programación, o pasarlo a un usuario final. El comportamiento adecuado en la administración de errores dependerá del tipo de aplicación, la audiencia y el origen del error.

En la siguiente lista se describe el rango de códigos de estado de los que puede recibir Lambda.

2xx

Un error de serie 2xx con un X-Amz-Function-Error encabezado en la respuesta indica un error de Lambda tiempo de ejecución o función. Un código de estado de 2xx serie indica que Lambda aceptó la solicitud, pero en lugar de un código de error, Lambda indica el error al incluir el X-Amz-Function-Error encabezado en la respuesta.

4xx

Un error de serie 4xx indica un error que el cliente o servicio invocador puede corregir modificando la solicitud, solicitando permiso o reintentando la solicitud. 4xx errores de serie distintos de 429 lo general indican un error con la solicitud.

5xx

Un error de serie 5xx indica un problema con Lambda, o un problema con la configuración o los recursos de la función. Los errores de serie 5xx pueden indicar una condición temporal que se puede resolver sin ninguna acción del usuario. Estos problemas no pueden ser resueltos por el cliente o servicio invocador, pero el propietario de una función Lambda puede solucionar el problema.

Para obtener una lista completa de errores de invocación, consulte Invocar errores de API.

Crear una función que devuelve excepciones

Puede crear una función Lambda que muestre mensajes de error legibles por humanos a los usuarios.

nota

Para probar este código, debe incluir InputLengthException.java en la carpeta src del proyecto.

ejemplo src/main/java/example/HandlerDivide.java –: excepción en tiempo de ejecución.

import java.util.List; // Handler value: example.HandlerDivide public class HandlerDivide implements RequestHandler<List<Integer>, Integer>{ Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public Integer handleRequest(List<Integer> event, Context context) { LambdaLogger logger = context.getLogger(); // process event if ( event.size() != 2 ) { throw new InputLengthException("Input must be an array that contains 2 numbers."); } int numerator = event.get(0); int denominator = event.get(1); logger.log("EVENT: " + gson.toJson(event)); logger.log("EVENT TYPE: " + event.getClass().toString()); return numerator/denominator; } }

Cuando se lanza la función InputLengthException, el entorno de ejecución de Java la serializa en el siguiente documento.

ejemplo documento de error (con espacios en blanco agregados)

{ "errorMessage":"Input must contain 2 numbers.", "errorType":"java.lang.InputLengthException", "stackTrace": [ "example.HandlerDivide.handleRequest(HandlerDivide.java:23)", "example.HandlerDivide.handleRequest(HandlerDivide.java:14)" ] }

En este ejemplo, InputLengthException es una RuntimeException. La interfaz RequestHandler no permite excepciones comprobadas. La interfaz RequestStreamHandler permite que se generen errores IOException.

La instrucción return del ejemplo anterior también puede generar una excepción en tiempo de ejecución.

return numerator/denominator;

Este código puede devolver un error aritmético.

{"errorMessage":"/ by zero","errorType":"java.lang.ArithmeticException","stackTrace":["example.HandlerDivide.handleRequest(HandlerDivide.java:28)","example.HandlerDivide.handleRequest(HandlerDivide.java:13)"]}

Uso de la consola de Lambda

Puede invocar su función en la consola Lambda configurando un evento de prueba y viendo la salida. La salida se captura en los registros de ejecución de la función y, cuando el seguimiento activo está habilitado, en AWS X-Ray.

Para invocar una función en la consola Lambda

  1. Abra la Página de funciones en la consola de Lambda.

  2. Elija una función.

  3. Seleccione Test (Probar).

  4. Seleccione Nuevo evento y, a continuación, elija una Plantilla de evento de la lista desplegable.

  5. Introduzca un nombre para el evento de prueba.

  6. Introduzca el JSON para el evento de prueba.

  7. Elija Create event (Crear evento).

  8. Elija Invoke (Invocar).

La consola de Lambda invoca la función de forma sincrónica y muestra el resultado. Para ver la respuesta, los registros y otra información, expanda la sección Details (Detalles).

Uso de AWS Command Line Interface (AWS CLI)

La AWS CLI es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante el uso de comandos en el shell de la línea de comandos. Para completar los pasos en esta sección, debe disponer de lo siguiente:

Cuando se invoca una función Lambda en AWS CLI, la AWS CLI divide la respuesta en dos documentos. La respuesta AWS CLI se muestra en el símbolo del sistema. Si se ha producido un error, la respuesta contiene un campo FunctionError. La respuesta de invocación o error devuelto por la función se escribe en un archivo de salida. Por ejemplo, output.json o output.txt.

En el siguiente ejemplo de comando invoke se muestra cómo invocar una función y escribir la respuesta de invocación en un archivo output.txt.

mac OS/Linux OS
aws lambda invoke --function-name my-function --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
Windows OS
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt

Debería ver la respuesta AWS CLI en su símbolo del sistema:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Debería ver la respuesta de invocación de función en el archivo output.txt. En el mismo símbolo del sistema, también puede ver la salida en el símbolo del sistema usando:

cat output.txt

Debería ver la respuesta de invocación en el símbolo del sistema.

{"errorMessage":"Input must contain 2 numbers.","errorType":"java.lang.InputLengthException","stackTrace": ["example.HandlerDivide.handleRequest(HandlerDivide.java:23)","example.HandlerDivide.handleRequest(HandlerDivide.java:14)"]}

Lambda también registra hasta 256 KB del objeto de error en los registros de la función. Para obtener más información, consulte Registro de funciones de AWS Lambda en Java.

Administración de errores en otros servicios de AWS

Cuando otro servicio de AWS invoca la función, el servicio elige el tipo de invocación y el comportamiento que va a adoptar con respecto a los reintentos. Los servicios de AWS pueden invocar la función en función de un calendario, en respuesta a un evento del ciclo de vida de un recurso o para atender una solicitud de un usuario. Algunos servicios invocan funciones de forma asíncrona y permiten que Lambda administre los errores, mientras que otros vuelven a intentarlo o pasan los errores al usuario.

Por ejemplo, API Gateway trata todos los errores de invocación y función como errores internos. Si la API de Lambda rechaza la solicitud de invocación, API Gateway devuelve un código de error 500. Si la función se ejecuta pero devuelve un error o devuelve una respuesta con un formato incorrecto, API Gateway muestra un código de error 502. Para personalizar la respuesta del error, debe detectar errores en el código y elaborar una respuesta en el formato que desee.

Recomendamos utilizar AWS X-Ray para determinar el origen de un error y su causa. X-Ray le permite averiguar qué componente encontró un error y ver detalles sobre los errores. En el ejemplo siguiente, se muestra un error de una función que generó una respuesta 502 de API Gateway.


          Mapa de seguimiento de un error de función con API Gateway.

Para obtener más información, consulte Instrumentación del código Java en AWS Lambda.

Aplicaciones de muestra

El repositorio de GitHub para esta guía contiene aplicaciones de ejemplo en las que se muestra el uso de los errores. Cada una de las aplicaciones de ejemplo contiene scripts para facilitar la implementación y la limpieza, una plantilla de Modelo de aplicación sin servidor de AWS (AWS SAM) y recursos de soporte.

Aplicaciones de Lambda de ejemplo en Java

  • blank-java – función de Java que muestra el uso de bibliotecas de Java de Lambda, el registro, las variables de entorno, las capas, el seguimiento de AWS X-Ray, las pruebas unitarias y el AWS SDK.

  • java-basic: función de Java mínima con pruebas unitarias y configuración de registro de variables.

  • java-events – función de Java mínima que utiliza la biblioteca aws-lambda-java-events con tipos de eventos que no requieren el SDK AWS como dependencia, como Amazon API Gateway.

  • java-events-v1sdk – Función Java que utiliza la biblioteca aws-lambda-java-events con tipos de eventos que requieren el AWS SDK como una dependenciaAmazon Simple Storage Service ((Amazon S3) Amazon DynamoDB, y Amazon Kinesis).

  • s3-java: función de Java que procesa los eventos de notificación de Amazon S3 y utiliza Java Class Library (JCL) para crear miniaturas de los archivos de imagen cargados.

La función java-basic incluye un controlador (HandlerDivide) que devuelve una excepción en tiempo de ejecución personalizada. El controlador HandlerStream implementa RequestStreamHandler y puede generar una excepción comprobada IOException.

Siguientes pasos