Controlador de funciones de AWS Lambda Java - AWS Lambda

Controlador de funciones de AWS Lambda Java

El controlador de la función Lambda es el método del código de la función que procesa eventos. Cuando se invoca una función, Lambda ejecuta el método del controlador. Si el controlador existe o devuelve una respuesta, pasará a estar disponible para gestionar otro evento.

En el siguiente ejemplo, la clase Handler define un método de controlador llamado handleRequest. El método handler toma un evento y un objeto contextual como entrada y devuelve una cadena.

ejemplo Handler.java

package example; import com.amazonaws.services.lambda.runtime.Context import com.amazonaws.services.lambda.runtime.RequestHandler import com.amazonaws.services.lambda.runtime.LambdaLogger ... // Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String>{ Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public String handleRequest(Map<String,String> event, Context context) { LambdaLogger logger = context.getLogger(); String response = new String("200 OK"); // log execution details logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); logger.log("CONTEXT: " + gson.toJson(context)); // process event logger.log("EVENT: " + gson.toJson(event)); logger.log("EVENT TYPE: " + event.getClass().toString()); return response; } }

El entorno de ejecución de Lambda recibe un evento como una cadena con formato JSON y lo convierte en un objeto. Pasa el objeto del evento al controlador de la función junto con un objeto contextual que proporciona detalles sobre la invocación y la función. Es usted quien debe decirle al entorno de ejecución qué método va a invocar estableciendo el parámetro del controlador en la configuración de la función.

Formatos de controlador

  • package.Class::method: formato completo. Por ejemplo: example.Handler::handleRequest.

  • package.Class: formato abreviado para las funciones que implementan una interfaz de controlador. Por ejemplo: example.Handler.

Puede agregar un código de inicialización fuera del método del controlador para reutilizar los recursos en diferentes invocaciones. Cuando el entorno de ejecución carga el controlador, ejecuta código estático y el constructor de clases. Los recursos que se crean durante la inicialización permanecen en la memoria entre las invocaciones y el controlador puede reutilizarlos miles de veces.

En el siguiente ejemplo, el registrador, el serializador y el cliente del SDK de AWS se crean cuando la función sirve su primer evento. Los eventos que esta misma instancia de la función sirve posteriormente son mucho más rápidos porque esos recursos ya existen.

ejemplo Handler.java – :código de inicialización

// Handler value: example.Handler public class Handler implements RequestHandler<SQSEvent, String>{ private static final Logger logger = LoggerFactory.getLogger(Handler.class); private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final LambdaAsyncClient lambdaClient = LambdaAsyncClient.create(); ... @Override public String handleRequest(SQSEvent event, Context context) { String response = new String(); // call Lambda API logger.info("Getting account settings"); CompletableFuture<GetAccountSettingsResponse> accountSettings = lambdaClient.getAccountSettings(GetAccountSettingsRequest.builder().build()); // log execution details logger.info("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); ...

El repositorio de GitHub para esta guía contiene aplicaciones de ejemplo fáciles de implementar en las que se muestran diferentes tipos de controladores. Para obtener más información, consulte el final de este tema.

Elección de los tipos de entrada y salida

Especifique el tipo de objeto al que se asigna el evento en la firma del método del controlador. En el ejemplo anterior, el entorno de ejecución de Java deserializa el evento en un tipo que implementa la interfaz Map<String,String>. Los mapas de cadena a cadena funcionan para eventos planos como los siguientes:

ejemplo Event.json –: datos del tiempo

{ "temperatureK": 281, "windKmh": -3, "humidityPct": 0.55, "pressureHPa": 1020 }

Sin embargo, el valor de cada campo debe ser una cadena o un número. Si el evento contiene un campo que tiene un objeto como valor, el entorno de ejecución no puede deserializarlo y devuelve un error.

Elija un tipo de entrada que funcione con los datos del evento que procesa la función. Puede utilizar un tipo básico, un tipo genérico o un tipo bien definido.

Tipos de entrada

  • Integer, Long, Double, etc.: el evento es un número sin formato adicional; por ejemplo, 3.5. El entorno de ejecución convierte el valor en un objeto del tipo especificado.

  • String: el evento es una cadena JSON, incluidas las comillas; por ejemplo, "My string.". El tiempo de ejecución convierte el valor (sin comillas) en un objeto String.

  • Type, Map<String,Type>, etc.: el evento es un objeto JSON. El entorno de ejecución lo deserializa en un objeto del tipo especificado o una interfaz.

  • List<Integer>, List<String>, List<Object>, etc.: el evento es una matriz JSON. El entorno de ejecución lo deserializa en un objeto del tipo especificado o una interfaz.

  • InputStream: el evento es cualquier tipo JSON. El entorno de ejecución pasa una secuencia de bytes del documento al controlador sin modificaciones. Usted deserializa la entrada y escribe la salida en una secuencia de salida.

  • Tipo de biblioteca: – en el caso de los eventos enviados por los servicios de AWS, utilice los tipos de la biblioteca aws-lambda-java-events.

Si define su propio tipo de entrada, debería ser un objeto Java estándar (POJO) mutable y deserializable, con un constructor predeterminado y unas propiedades predeterminadas para cada campo del evento. Las claves del evento que no se asignan a una propiedad, así como las propiedades que no están incluidas en el evento, se eliminan sin errores.

El tipo de salida puede ser un objeto o void. El entorno de ejecución serializa los valores devueltos en texto. Si la salida es un objeto con campos, el entorno de ejecución lo serializa en un documento JSON. Si se trata de un tipo que encapsula un valor primitivo, el tiempo de ejecución devuelve una representación de texto de ese valor.

Interfaces de controlador

La biblioteca aws-lambda-java-core define dos interfaces para los métodos de controlador. Utilice las interfaces proporcionadas para simplificar la configuración del controlador y validar la firma del método del controlador en tiempo de compilación.

La interfaz RequestHandler es un tipo genérico que toma dos parámetros: el tipo de entrada y el tipo de salida. Los dos tipos deben ser objetos. Cuando se utiliza esta interfaz, el entorno de ejecución de Java deserializa el evento en un objeto con el tipo de entrada y serializa la salida en texto. Utilice esta interfaz si la serialización integrada funcione con los tipos de entrada y salida.

ejemplo Handler.java –: interfaz del controlador

// Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String>{ @Override public String handleRequest(Map<String,String> event, Context context)

Para usar su propia serialización, implemente la interfaz RequestStreamHandler. Con esta interfaz, Lambda pasa al controlador una secuencia de entrada y otra secuencia de salida. El controlador lee los bytes de la secuencia de entrada, escribe en la secuencia de salida y devuelve void.

En el ejemplo siguiente se utilizan unos tipos de lectores y escritores almacenados en el búfer para trabajar con las secuencias de entrada y salida. Utiliza la biblioteca Gson para la serialización y la deserialización.

ejemplo HandlerStream.java

import com.amazonaws.services.lambda.runtime.Context import com.amazonaws.services.lambda.runtime.RequestStreamHandler import com.amazonaws.services.lambda.runtime.LambdaLogger ... // Handler value: example.HandlerStream public class HandlerStream implements RequestStreamHandler { Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { LambdaLogger logger = context.getLogger(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("US-ASCII"))); PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream, Charset.forName("US-ASCII")))); try { HashMap event = gson.fromJson(reader, HashMap.class); logger.log("STREAM TYPE: " + inputStream.getClass().toString()); logger.log("EVENT TYPE: " + event.getClass().toString()); writer.write(gson.toJson(event)); if (writer.checkError()) { logger.log("WARNING: Writer encountered an error."); } } catch (IllegalStateException | JsonSyntaxException exception) { logger.log(exception.toString()); } finally { reader.close(); writer.close(); } } }

Ejemplo de código del controlador

El repositorio de GitHub para esta guía contiene aplicaciones de ejemplo en las que se muestra el uso de diferentes tipos de controladores e interfaces. Cada una de las aplicaciones de ejemplo contiene scripts para facilitar la implementación y la limpieza, una plantilla de 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.

Las aplicaciones blank-java y s3-java toman un evento de un servicio de AWS como entrada y devuelven una cadena. La aplicación java-basic contiene varios tipos de controladores:

Para probar diferentes tipos de controlador, solo tiene que cambiar el valor del controlador en la plantilla de AWS SAM. Para obtener instrucciones detalladas, consulte el archivo readme (léame) de la aplicación de ejemplo.