Computación sin servidor con AWS Lambda, parte 1

La computación sin servidor puede ser lo más candente en la computación en la nube hoy en día, pero ¿qué es exactamente? Este tutorial de dos partes comienza con una descripción general de la computación sin servidor, desde qué es hasta por qué se considera disruptiva para la computación en la nube tradicional y cómo se puede usar en la programación basada en Java.

Después de la descripción general, obtendrá una introducción práctica a AWS Lambda, que muchos consideran la principal solución basada en Java para la informática sin servidor en la actualidad. En la parte 1, utilizará AWS Lambda para crear, implementar y probar su primera función Lambda en Java. En la parte 2, integrará su función Lambda con DynamoDB y luego usará AWS SDK para invocar funciones Lambda en una aplicación Java.

¿Qué es la informática sin servidor?

El año pasado estuve hablando con un pasante de la empresa sobre diferentes patrones arquitectónicos y mencioné la arquitectura sin servidor. Se apresuró a señalar que todas las aplicaciones requieren un servidor y no pueden ejecutarse en el aire. El interno tenía razón, incluso si echaba de menos el mío. La informática sin servidor no es una plataforma mágica para ejecutar aplicaciones.

De hecho, la informática sin servidor simplemente significa que usted, el desarrollador, no tiene que lidiar con el servidor. Una plataforma informática sin servidor como AWS Lambda le permite crear su código e implementarlo sin necesidad de configurar o administrar servidores subyacentes. Su unidad de implementación es su código; no el contenedor que aloja el código, o el servidor que ejecuta el código, sino simplemente el código en sí. Desde el punto de vista de la productividad, existen beneficios obvios al descargar los detalles de dónde se almacena el código y cómo se administra el entorno de ejecución. La computación sin servidor también tiene un precio basado en métricas de ejecución, por lo que también hay una ventaja financiera.

¿Cuánto cuesta AWS Lambda?

En el momento de redactar este documento, el nivel de precios de AWS Lambda se basa en la cantidad de ejecuciones y la duración de la ejecución:

  • Sus primeros millones de ejecuciones por mes son gratis, luego paga $ 0.20 por millón de ejecuciones a partir de entonces ($ 0.0000002 por solicitud).
  • La duración se calcula desde el momento en que su código comienza a ejecutarse hasta que devuelve un resultado, redondeado a los 100 ms más cercanos. El monto cobrado se basa en la cantidad de RAM asignada a la función, donde el costo es de $ 0.00001667 por cada GB-segundo.

Los detalles de precios y las asignaciones de niveles gratuitos son un poco más complicados de lo que implica la descripción general. Visite el nivel de precios para recorrer algunos escenarios de precios.

Para tener una idea de cómo funciona la informática sin servidor, comencemos con el modelo de ejecución de la informática sin servidor, que se ilustra en la Figura 1.

Steven Haines

Aquí está el modelo de ejecución sin servidor en pocas palabras:

  1. Un cliente realiza una solicitud a la plataforma informática sin servidor para ejecutar una función específica.
  2. La plataforma informática sin servidor primero verifica si la función se está ejecutando en alguno de sus servidores. Si la función aún no se está ejecutando, la plataforma carga la función desde un almacén de datos.
  3. Luego, la plataforma implementa la función en uno de sus servidores, que están preconfigurados con un entorno de ejecución que puede ejecutar la función.
  4. Ejecuta la función y captura el resultado.
  5. Devuelve el resultado al cliente.

A veces, la informática sin servidor se denomina Función como servicio (FaaS), porque la granularidad del código que se crea es una función . La plataforma ejecuta su función en su propio servidor y organiza el proceso entre las solicitudes de función y las respuestas de función.

Nanoservicios, escalabilidad y precio

Tres cosas realmente importan sobre la computación sin servidor: su arquitectura de nanoservicio; el hecho de que es prácticamente infinitamente escalable; y el modelo de precios asociado con esa escalabilidad casi infinita. Profundizaremos en cada uno de esos factores.

Nanoservicios

Ha oído hablar de microservicios y probablemente sepa sobre aplicaciones de 12 factores, pero las funciones sin servidor llevan el paradigma de dividir un componente en sus partes constituyentes a un nivel completamente nuevo. El término "nanoservicios" no es un término reconocido por la industria, pero la idea es simple: cada nanoservicio debe implementar una sola acción o responsabilidad. Por ejemplo, si quisiera crear un widget, el acto de creación sería su propio nanoservicio; si quisiera recuperar un widget, el acto de recuperación también sería un nanoservicio; y si quisiera hacer un pedido de un widget, ese pedido sería otro nanoservicio más.

Una arquitectura de nanoservicios le permite definir su aplicación a un nivel muy detallado. De manera similar al desarrollo basado en pruebas (que lo ayuda a evitar efectos secundarios no deseados al escribir su código en el nivel de pruebas individuales), una arquitectura de nanoservicios fomenta la definición de su aplicación en términos de funciones específicas y muy detalladas. Este enfoque aumenta la claridad sobre lo que está creando y reduce los efectos secundarios no deseados del nuevo código.

Microservicios vs nanoservicios

Los microservicios nos alienta a dividir una aplicación en una colección de servicios, cada uno de los cuales realiza una tarea específica. El desafío es que nadie ha cuantificado realmente el alcance de un microservicio. Como resultado, terminamos definiendo microservicios como una colección de servicios relacionados, todos interactuando con el mismo modelo de datos. Conceptualmente, si tiene una funcionalidad de bajo nivel que interactúa con un modelo de datos dado, entonces la funcionalidad debe ir a uno de sus servicios relacionados. Las interacciones de alto nivel deben realizar llamadas al servicio en lugar de consultar la base de datos directamente.

Existe un debate en curso en la computación sin servidor sobre si construir funciones Lambda a nivel de microservicios o nanoservicios. La buena noticia es que puede crear sus funciones con bastante facilidad en cualquier granularidad, pero una estrategia de microservicios requerirá un poco de lógica de enrutamiento adicional en su controlador de solicitudes.

Desde una perspectiva de diseño, las aplicaciones sin servidor deben estar muy bien definidas y limpias. Desde una perspectiva de implementación, necesitará administrar muchas más implementaciones, pero también tendrá la capacidad de implementar nuevas versiones de sus funciones de forma individual, sin afectar a otras funciones. La computación sin servidor es especialmente adecuada para el desarrollo en equipos grandes, donde puede ayudar a que el proceso de desarrollo sea más fácil y el código sea menos propenso a errores.

Escalabilidad

Además de introducir un nuevo paradigma arquitectónico, las plataformas informáticas sin servidor proporcionan una escalabilidad prácticamente infinita. Digo "prácticamente" porque no existe realmenteescalabilidad infinita. Sin embargo, para todos los propósitos prácticos, los proveedores de computación sin servidor como Amazon pueden manejar más carga de la que usted podría arrojarles. Si tuviera que administrar la ampliación de sus propios servidores (o máquinas virtuales basadas en la nube) para satisfacer el aumento de la demanda, necesitaría monitorear el uso, identificar cuándo iniciar más servidores y agregar más servidores a su clúster en el momento adecuado. Del mismo modo, cuando la demanda disminuya, deberá reducir la escala manualmente. Con la computación sin servidor, usted le indica a su plataforma de computación sin servidor el número máximo de solicitudes de funciones simultáneas que desea ejecutar y la plataforma realiza el escalado por usted.

Precios

Finally, the serverless computing pricing model allows you to scale your cloud bill based on usage. When you have light usage, your bill will be low (or nil if you stay in the free range). Of course, your bill will increase with usage, but hopefully you will also have new revenue to support your higher cloud bill. For contrast, if you were to manage your own servers, you would have to pay a base cost to run the minimum number of servers required. As usage increased, you would scale up in increments of entire servers, rather than increments of individual function calls. The serverless computing pricing model is directly proportional to your usage.

AWS Lambda for serverless computing

AWS Lambda es una plataforma informática sin servidor implementada sobre plataformas de servicios web de Amazon como EC2 y S3. AWS Lambda cifra y almacena su código en S3. Cuando se solicita que se ejecute una función, crea un "contenedor" utilizando sus especificaciones de tiempo de ejecución, lo implementa en una de las instancias EC2 en su granja de procesamiento y ejecuta esa función. El proceso se muestra en la Figura 2.

Steven Haines

When you create a Lambda function, you configure it in AWS Lambda, specifying things like the runtime environment (we'll use Java 8 for this article), how much memory to allocate to it, identity and access management roles, and the method to execute. AWS Lambda uses your configuration to setup a container and deploy the container to an EC2 instance. It then executes the method that you've specified, in the order of package, class, and method.

At the time of this writing, you can build Lambda functions in Node, Java, Python, and most recently, C#. For the purposes of this article we will use Java.

What is a Lambda function?

When you write code designed to run in AWS Lambda, you are writing functions. The term functions comes from functional programming, which originated in lambda calculus. The basic idea is to compose an application as a collection of functions, which are methods that accept arguments, compute a result, and have no unwanted side-effects. Functional programming takes a mathematical approach to writing code that can be proven to be correct. While it's good to keep functional programming in mind when you are writing code for AWS Lambda, all you really need to understand is that the function is a single-method entry-point that accepts an input object and returns an output object.

Serverless execution modes

While Lambda functions can run synchronously, as described above, they can also run asynchronously and in response to events. For example, you could configure a Lambda to run whenever a file was uploaded to an S3 bucket. This configuration is sometimes used for image or video processing: when a new image is uploaded to an S3 bucket, a Lambda function is invoked with a reference to the image to process it.

I worked with a very large company that leveraged this solution for photographers covering a marathon. The photographers were on the course taking photographs. Once their memory cards were full, they loaded the images onto a laptop and uploaded the files to S3. As images were uploaded, Lambda functions were executed to resize, watermark, and add a reference for each image to its runner in the database.

All of this would take a lot of work to accomplish manually, but in this case the work not only processed faster because of AWS Lambda's horizontal scalability, but also seamlessly scaled up and back down, thus optimizing the company's cloud bill.

In addition to responding to files uploaded to S3, lambdas can be triggered by other sources, such as records being inserted into a DynamoDB database and analytic information streaming from Amazon Kinesis. We'll look at an example featuring DynamoDB in Part 2.

AWS Lambda functions in Java

Now that you know a little bit about serverless computing and AWS Lambda, I'lll walk you through building an AWS Lambda function in Java. 

descargar Obtenga el código Código fuente de la aplicación de ejemplo para este tutorial, "Computación sin servidor con AWS Lambda". Creado por Steven Haines para JavaWorld.

Implementación de funciones Lambda

Puede escribir una función Lambda de dos formas:

  • La función puede recibir un flujo de entrada al cliente y escribir en un flujo de salida de regreso al cliente.
  • La función puede usar una interfaz predefinida, en cuyo caso AWS Lambda deserializará automáticamente el flujo de entrada a un objeto, lo pasará a su función y serializará la respuesta de su función antes de devolverla al cliente.

La forma más sencilla de implementar una función de AWS Lambda es utilizar una interfaz predefinida. Para Java, primero debe incluir la siguiente biblioteca principal de AWS Lambda en su proyecto (tenga en cuenta que este ejemplo usa Maven):

 com.amazonaws aws-lambda-java-core 1.1.0  

Next, have your class implement the following interface:

Listing 1. RequestHandler.java

 public interface RequestHandler { /** * Handles a Lambda function request * @param input The Lambda function input * @param context The Lambda execution environment context object. * @return The Lambda function output */ public O handleRequest(I input, Context context); } 

The RequestHandler interface defines a single method: handleRequest(), which is passed an input object and a Context object, and returns an output object. For example, if you were to define a Request class and a Response class, you could implement your lambda as follows:

 public class MyHandler implements RequestHandler { public Response handleRequest(Request request, Context context) { ... } } 

Alternatively, if you wanted to bypass the predefined interface, you could manually handle the InputStream and OutputStream yourself, by implementing a method with the following signature:

 public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { ... } 

The Context object provides information about your function and the environment in which it is running, such as the function name, its memory limit, its logger, and the amount of time remaining, in milliseconds, that the function has to complete before AWS Lambda kills it.