¿Qué es una arquitectura sin servidor?
La arquitectura sin servidor ejecuta código personalizado en contenedores efímeros totalmente gestionados por terceros. El código personalizado suele ser una pequeña parte de una aplicación completa. También se denomina función. Esto da otro nombre a la arquitectura sin servidor como Función como servicio (FaaS). El contenedor es efímero porque sólo puede durar una invocación. El contenedor puede reutilizarse, pero no es algo en lo que se pueda confiar. Como desarrollador, subes el código a la plataforma FaaS, y el servicio se encarga de toda la capacidad, escalado, parcheado y administración de la infraestructura para ejecutar tu código.
Una aplicación construida utilizando Serverless Architecture sigue el enfoque dirigido por eventos. Por ejemplo, se produce una actividad en la aplicación, como un clic. Esto es muy diferente de una arquitectura clásica donde el código de la aplicación se despliega típicamente en un servidor de aplicaciones como Tomcat o WildFly. Escalar su aplicación significa iniciar instancias adicionales del servidor de aplicaciones o hilar contenedores adicionales con el servidor de aplicaciones empaquetado. Es necesario actualizar el equilibrador de carga con las nuevas direcciones IP. Los sistemas operativos necesitan parches, actualizaciones y mantenimiento.
Arquitecturas sin servidor explicar la diferencia entre el modelo de programación clásico y esta nueva arquitectura sin servidor. Con una plataforma FaaS tu aplicación se divide en múltiples funciones. Cada función se despliega en FaaS. El servicio pone en marcha instancias de computación adicionales para satisfacer las demandas de escalabilidad de su aplicación. Las plataformas FaaS proporcionan el entorno de ejecución y se encargan de iniciar y desinstalar los contenedores para ejecutar su función.
Leer Arquitecturas sin servidor para más detalles sobre estas imágenes. Una de las grandes ventajas de FaaS es que sólo se cobra por el tiempo de computación, es decir, el tiempo que el código está en ejecución. No se cobra nada cuando el código no se está ejecutando. ¿En qué se diferencian las funciones de las máquinas virtuales y los contenedores?
Tenga en cuenta que se utilizan contenedores Linux en lugar de contenedores Docker como implementación para AWS Lambda.
¿En qué se diferencia FaaS de PaaS?
Como se cita en Arquitecturas sin servidorUna respuesta rápida la ofrece el siguiente tuit:
Si su PaaS puede iniciar de forma eficiente instancias en 20 ms que se ejecutan durante medio segundo, entonces llámelo serverless. https://t.co/S3YzvqFYLR
- adrian cockcroft (@adrianco) 28 de mayo de 2016
En otras palabras, la mayoría de las aplicaciones PaaS no están orientadas a subir y bajar aplicaciones enteras para cada solicitud, mientras que las plataformas FaaS hacen exactamente esto. Abstracción del back-end con FaaS explicar la diferencia con las distintas ofertas de *aaS. La imagen del blog se muestra a continuación:
Arquitecturas sin servidor también proporcionan grandes detalles sobre lo que es y lo que no es FaaS. AWS Lambda, Funciones de Google Cloud y Funciones Azure son algunas de las opciones para ejecutar aplicaciones sin servidor. Este blog mostrará cómo escribir su primera función de AWS Lambda.
¿Qué es AWS Lambda?
AWS Lambda es un servicio FaaS de Amazon Web Services. Ejecuta el código en una infraestructura informática de alta disponibilidad y realiza toda la administración de los recursos informáticos, incluido el mantenimiento del servidor y del sistema operativo, el aprovisionamiento de capacidad y el escalado automático, la monitorización del código y el registro. AWS Lambda le cobra por la duración de la ejecución del código en incrementos de 100 ms. No hay ningún costo asociado al almacenamiento de datos. El almacenamiento de la función de Lambda en AWS no conlleva ningún costo.
El primer millón de solicitudes al mes son gratuitas y a partir de ahí el precio es nominal. Más información en Precios Lambda. También proporciona visibilidad del rendimiento mediante métricas y registros en tiempo real para AWS CloudWatch. Todo lo que tienes que hacer es escribir el código. He aquí una rápida introducción:
Consulte también Novedades de AWS Lambda en AWS ReInvent 2016:
Consulte también Serverless Architectural Patterns and Best Practices de AWS ReInvent 2016:
El código que ejecuta en AWS Lambda se denomina función Lambda. Cargue el código como archivo zip o diséñelo con la función Consola de administración de AWS Lambda. Hay un soporte incorporado para AWS SDK y esto simplifica la capacidad de llamar a otros servicios de AWS. En resumen, Lambda es escalable, sin servidor, computación en la nube. AWS Lambda proporciona varios entornos de ejecución:
- Node.js - v0.10.36, v4.3.2 (recomendado)
- Java - Java 8
- Python - Python 2.7
- .NET Core - .NET Core 1.0.1 (C#)
Este blog mostrará cómo hacerlo:
- Construir una aplicación Java que almacene un documento JSON en Couchbase
- Utilizar Maven para crear un paquete de despliegue para una aplicación Java
- Crear una función lambda
- Actualizar la función lambda
El código completo de este blog está disponible en github.com/arun-gupta/serverless/tree/master/aws/hellocouchbase.
Aplicación Java para AWS Lambda
En primer lugar, veamos una aplicación Java que se utilizará para esta función Lambda. Modelo de programación para funciones lambda en Java proporcionan más detalles sobre cómo escribir el código de la función Lambda en Java. Nuestra función Lambda implementará la interfaz predefinida com.amazonaws.services.lambda.runtime.RequestHandler
. El código tiene el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
público clase HelloCouchbase implementa RequestHandler<Solicitar, Cadena> { CouchbaseCluster grupo; Cubo cubo; LambdaLogger registrador; @Anular público Cadena handleRequest(Solicitar solicitar, Contexto contexto) { SimpleDateFormat formato de fecha = nuevo SimpleDateFormat("aaaa-MM-dd HH:mm:ss.SSS"); Cadena marca de tiempo = formato de fecha.formato(Calendario.getInstance().getTime()); registrador = contexto.getLogger(); registrador.registro("Solicitud recibida: %s" + marca de tiempo); BotónDocumento botónDocumento = nuevo BotónDocumento(); botónDocumento.setId(contexto.getAwsRequestId()); botónDocumento.setRequestId(contexto.getAwsRequestId()); botónDocumento.setTimestamp(Cadena.valueOf(marca de tiempo)); getBucket().upsert(botónDocumento.toJson()); devolver botónDocumento.toString(); } |
handleRequest
es donde se implementa el código de la función. Contexto
proporciona información útil sobre el entorno de ejecución de Lambda. Parte de la información del contexto se almacena en un documento JSON. Por último, SDK Java de Couchbase API upsert
se utiliza para escribir un documento JSON en la instancia de Couchbase identificada. Couchbase en Amazon EC2 proporciona instrucciones completas para instalar Couchbase en AWS EC2. La información sobre el servidor Couchbase se obtiene como:
1 2 3 4 5 6 7 |
público CouchbaseCluster getCluster() { si (null == grupo) { registrador.registro("env: " + Sistema.getenv("COUCHBASE_HOST")); grupo = CouchbaseCluster.crear(Sistema.getenv("COUCHBASE_HOST")); } devolver grupo; } |
Esto es una vez más utilizando Couchbase Java API CouchbaseCluster como punto de entrada principal al cluster Couchbase. El sitio COUCHBASE_HOST
cuando se crea la función Lambda. En nuestro caso, esto apuntaría a un clúster Couchbase de un solo nodo que se ejecuta en AWS EC2. Recientemente se han introducido variables de entorno en AWS Lambda. Por último, necesitas acceder a este bucket en el servidor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público Cubo getBucket() { mientras que (null == cubo) { registrador.registro("Intentando conectar con la base de datos"); cubo = getCluster().openBucket("sin servidor", 2L, Unidad de tiempo.ACTAS); pruebe { Hilo.dormir(3000); } captura (Excepción e) { registrador.registro("Excepción de hilo dormido: " + e.toString()); tirar nuevo RuntimeException(e); } } devolver cubo; } |
El nombre del cubo es sin servidor
y todos los documentos JSON se almacenan en él. Un simple Aplicación Hola Mundo también puede utilizarse para crear esta función.
Crear paquete de implementación de AWS Lambda
AWS FaaS necesita un paquete de despliegue. Este paquete Lambda puede ser .zip
o .jar
que contiene todas las dependencias de la función. Nuestra aplicación está empaquetada usando Maven, por lo que usaremos un plugin de Maven para crear un paquete de despliegue. La aplicación tiene pom.xml
con el siguiente fragmento de plugin:
1 2 3 4 5 6 7 8 9 10 11 |
org.apache.maven.plugins maven-sombra-plugin 2.3 falso paquete sombra |
Encontrará más información sobre la configuración de Maven en Creación de un paquete de despliegue .jar usando Maven sin ningún IDE. En maven-shade-plugin permite crear un uber-jar que incluye todas las dependencias. El sitio sombra
objetivo está vinculado al paquete
fase. Así que la paquete mvn
generará un único jar de despliegue. Empaquete la aplicación utilizando el comando paquete mvn
comando. Esto mostrará la salida:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[INFO] --- maven-tarro-plugin:2.4:tarro (por defecto-tarro) @ hellocouchbase --- [INFO] Edificio tarro: /Usuarios/arungupta/espacios de trabajo/sin servidor/aws/hellocouchbase/hellocouchbase/objetivo/hellocouchbase-1.0-SNAPSHOT.tarro [INFO] [INFO] --- maven-sombra-plugin:2.3:sombra (por defecto) @ hellocouchbase --- [INFO] Incluido com.amazonaws:aws-lambda-java-núcleo:tarro:1.1.0 en el sombreado tarro. [INFO] Incluido com.couchbase.cliente:java-cliente:tarro:2.3.6 en el sombreado tarro. [INFO] Incluido com.couchbase.cliente:núcleo-io:tarro:1.3.6 en el sombreado tarro. [INFO] Incluido io.reactivex:rxjava:tarro:1.1.8 en el sombreado tarro. [INFO] Sustitución de original artefacto con sombreado artefacto. [INFO] Sustitución de /Usuarios/arungupta/espacios de trabajo/sin servidor/aws/hellocouchbase/hellocouchbase/objetivo/hellocouchbase-1.0-SNAPSHOT.tarro con /Usuarios/arungupta/espacios de trabajo/sin servidor/aws/hellocouchbase/hellocouchbase/objetivo/hellocouchbase-1.0-SNAPSHOT-sombreado.tarro [INFO] ------------------------------------------------------------------------ [INFO] CONSTRUIR ÉXITO [INFO] ------------------------------------------------------------------------ |
En target/hello-couchbase-1.0-SNAPSHOT.jar
es el jar sombreado que se desplegará en AWS Lambda. Más detalles sobre la creación de un paquete de despliegue en Creación de un paquete de implantación.
Crear función AWS Lambda
Crear una función AWS Lambda con CLI DE AWS. El comando CLI en este caso tiene el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 11 |
aws lambda crear-función --función-nombre HolaMundo --papel arn:aws:Soy:::papel/servicio-papel/miLambdaRole --zip-archivo archivob:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar --manipulador org.muestra.sin servidor.aws.couchbase.HelloCouchbaseLambda --descripción "Hola Couchbase Lambda" --tiempo de ejecución java8 --región us-oeste-2 --tiempo de espera 30 --memoria-talla 1024 --publicar |
En esta CLI:
crear-función
crea una función Lambda--nombre de la función
proporciona el nombre de la función. El nombre de la función distingue entre mayúsculas y minúsculas.--rol
especifica el Nombre de Recurso de Amazon (ARN) de un Función IAM que Lambda asume cuando ejecuta su función para acceder a cualquier otro recurso de AWS. Si ha ejecutado una función Lambda
mediante la consola de AWS, se creará esta función para usted.--archivo zip
apunta al paquete de despliegue creado en el paso anterior.archivob
es un protocolo específico de la CLI de AWS para indicar que el contenido cargado es binario.--manejador
es la clase Java a la que se llama para iniciar la ejecución de la función--publica
solicitar a AWS Lambda que cree la función de Lambda y publique una versión como operación atómica. De lo contrario, es posible que se creen varias versiones y que se publiquen en un momento posterior.
La consola Lambda muestra:
Probar la función AWS Lambda
Pruebe la función de AWS Lambda con la CLI de AWS.
1 2 3 4 5 |
aws lambda invoque --función-nombre HelloCouchbaseLambda --región us-oeste-2 --carga útil '' hellocouchbase.fuera |
Muestra la salida como:
1 2 3 |
{ "CódigoEstado": 200 } |
La salida del comando se almacena en hellocouchbase.out
y parece:
1 |
"{"id":"e6bbe71a-ca4f-11e6-95a7-95f2ed410493","installationId":null,"requestId":"e6bbe71a-ca4f-11e6-95a7-95f2ed410493","identityId":null,"marca de tiempo":"2016-12-25 03:12:01.157"}" |
Invocar esta función almacena un documento JSON en Couchbase. Los documentos almacenados en Couchbase se pueden ver usando la consola web de Couchbase. El nombre de usuario es Administrador
y la contraseña es el id de la instancia EC2. A continuación se muestran todos los buckets de datos de esta instancia de Couchbase:
Tenga en cuenta que el sin servidor
se crea manualmente. Al hacer clic en Documentos se muestran los detalles de los distintos documentos almacenados en el cubo:
Al hacer clic en cada documento se muestran más detalles sobre el documento JSON:
La función lambda también puede probarse utilizando la consola:
Actualizar la función AWS Lambda
Si la lógica de la aplicación cambia, es necesario cargar un nuevo paquete de despliegue para la función Lambda. En este caso, paquete mvn
creará un paquete de despliegue y aws lambda
El comando CLI se utiliza para actualizar el código de función:
1 2 3 4 5 |
aws lambda actualización-función-código --función-nombre HelloCouchbaseLambda --zip-archivo archivob:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar --región us-oeste-2 --publicar |
Muestra el resultado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "CodeSha256": "w510ejw/OoVsQt2JiLG2bPZPAaFvQCRrYYYlQWctCQE=", "NombreFunción": "HelloCouchbaseLambda", "TamañoCódigo": 6978108, "TamañoMemoria": 1024, "FunciónArn": "arn:aws:lambda:us-oeste-2::function:HelloCouchbaseLambda:8", "Medio ambiente: { "Variables": { "COUCHBASE_HOST": "ec2-35-165-249-235.us-west-2.compute.amazonaws.com" } }, "Versión": "8", "Rol": "arn:aws:iam:::role/service-role/myLambdaRole", "Tiempo de espera": 30, "LastModified": "2016-12-25T04:17:38.717+0000", "Manipulador": "org.sample.serverless.aws.couchbase.HelloCouchbaseLambda", "Tiempo de ejecución": "java8", "Descripción": "Java Hola Couchbase" } |
A continuación, se puede volver a invocar la función. Durante la redacción de este blog, esto también se utilizó a menudo para depurar la función. Esto se debe a que las funciones Lambda no tienen ningún estado o caja asociada a ellas. Y por lo tanto no se puede iniciar sesión en una caja para comprobar si la función no se desplegó correctamente. Sí que puedes utilizar las declaraciones de registro de CloudWatch una vez que la función esté funcionando.