Presentación de Amazon Web Services Modelo de aplicación sin servidoro SAM, hace un par de meses. Define una sintaxis simplificada para expresar
recursos sin servidor. SAM amplía AWS CloudFormation para añadir compatibilidad con API Gateway, AWS Lambda y Amazon DynamoDB. Este blog mostrará cómo crear un microservicio sencillo con
SAM. Por supuesto, usaremos Couchbase en lugar de DynamoDB. Este blog también utilizará los conceptos básicos explicados en Microservicios con AWS API Gateway, AWS Lambda y Couchbase. SAM
mostrará la facilidad con la que puede desplegarse y gestionarse toda la pila de microservicios.
A modo de repaso, he aquí los componentes clave de la arquitectura:
- El cliente puede ser curl, AWS CLI/Console, cliente Postman o cualquier otra herramienta/API que pueda invocar un endpoint REST.
- AWS API Gateway se utiliza para aprovisionar API. El recurso de nivel superior está disponible en la ruta
/libros. HTTPGETyPOSTpara el recurso. - Cada API activa una función Lambda. Se crean dos funciones Lambda,
lista de librospara listar todos los libros disponibles ylibro-crearpara crear un nuevo libro. - Couchbase se utiliza como almacén de persistencia en EC2. Todos los documentos JSON se almacenan y recuperan de esta base de datos.
Otros blogs sobre serverless:
- Microservicios con AWS API Gateway, AWS Lambda y Couchbase
- Botón AWS IoT, Lambda y Couchbase
- FaaS sin servidor con Lambda y Java
Empecemos.
Plantilla del modelo de aplicación sin servidor (SAM)
Una plantilla de AWS CloudFormation con recursos sin servidor que se ajustan a la norma Modelo SAM de AWS se denomina archivo SAM o plantilla. Se despliega
como una pila de CloudFormation. Echemos un vistazo a nuestra plantilla SAM: Esta plantilla está disponible en github.com/arun-gupta/serverless/blob/master/aws/microservice/template.yml.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Microservice using API Gateway, Lambda and Couchbase Resources: MicroserviceGetAllGateway: Type: AWS::Serverless::Function Properties: Handler: org.sample.serverless.aws.couchbase.gateway.BucketGetAll Runtime: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Timeout: 30 MemorySize: 1024 Environment: Variables: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com Role: arn:aws:iam::598307997273:role/microserviceRole Events: GetResource: Type: Api Properties: Path: /books Method: get MicroservicePostGateway: Type: AWS::Serverless::Function Properties: Handler: org.sample.serverless.aws.couchbase.gateway.BucketPost Runtime: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Timeout: 30 MemorySize: 1024 Environment: Variables: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com Role: arn:aws:iam::598307997273:role/microserviceRole Events: GetResource: Type: Api Properties: Path: /books Method: post |
Plantilla SAM Especificación proporcionar detalles completos sobre los contenidos de la plantilla. Las partes clave de la plantilla son:
- Define dos recursos, ambos de tipo Lambda Function identificados por
AWS::Sin servidor::Funciónatributo. El nombre de la función lambda se define medianteRecursos.. - La clase de cada manipulador se define mediante el valor de
Recursos..Propiedades.Manejadoratributo - Java 8 runtime se utiliza para ejecutar la función definida por
Recursos..Propiedades.Runtimeatributo - El código de la clase se sube a un bucket de S3, en nuestro caso a
s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Recursos.Propiedades.Variables.de.entorno.COUCHBASE_HOSTdefine el host donde se ejecuta Couchbase. Esto se puede implementar fácilmente en EC2 como se explica en Configurar Couchbase.- Cada función de Lambda se activa mediante una API. Se implementa mediante AWS API Gateway. La ruta se define mediante
Events.GetResource.Properties.Path. El método HTTP se define medianteEvents.GetResource.Properties.Methodatributo.
Aplicación Java
La aplicación Java que contiene las funciones Lambda se encuentra en github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint.
Función lambda activada por HTTP GET se muestra el método:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class BucketGetAll implements RequestHandler<GatewayRequest, GatewayResponse> { @Override public GatewayResponse handleRequest(GatewayRequest request, Context context) { try { N1qlQuery query = N1qlQuery .simple(select("*") .from(i(CouchbaseUtil.getBucketName())) .limit(10)); String result = CouchbaseUtil.getBucket().query(query).allRows().toString(); return new GatewayResponse(200, result, GatewayResponse.HEADERS_JSON); } catch (ConfigurationException e) { return new GatewayResponse(400, e.getMessage(), GatewayResponse.HEADERS_TEXT); } } } |
Un poco de explicación:
- Cada función Lambda debe implementar la interfaz
com.amazonaws.services.lambda.runtime.RequestHandler. - La integración de API Gateway y Lambda requiere un formato de entrada y formato de salida.
Estos formatos se definen comoGatewayRequestyGatewayResponseclases. - La función lógica utiliza SDK Java de Couchbase para consultar la base de datos Couchbase. N1QL se utiliza para consultar
la base de datos. A continuación, los resultados y la excepción se envuelven enGatewayRequestyGatewayResponse.
La función lambda activada por el método HTTP POST también es bastante sencilla:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class BucketPost implements RequestHandler<GatewayRequest, GatewayResponse> { @Override public GatewayResponse handleRequest(GatewayRequest request, Context context) { try { JsonDocument document = CouchbaseUtil.getBucket().upsert(Book.fromStringToJson(request.getBody())); return new GatewayResponse(200, document.content().toString(), GatewayResponse.HEADERS_JSON); } catch (Exception ex) { return new GatewayResponse(400, ex.getMessage(), GatewayResponse.HEADERS_TEXT); } } } |
Un poco de explicación:
- La carga útil de la solicitud entrante se recupera de
GatewayRequest - El documento insertado en Couchbase se devuelve como respuesta.
- Al igual que el método anterior, Function logic utiliza SDK Java de Couchbase para consultar la base de datos Couchbase. Los resultados y la excepción son entonces
envuelto enGatewayRequestyGatewayResponse.
Construir la aplicación Java como:
|
1 |
mvn -f microservice-http-endpoint/pom.xml clean package |
Cargar función lambda en S3
La plantilla SAM lee el código de un bucket S3. Vamos a crear un cubo S3:
|
1 |
aws s3 mb s3://serverless-microservice --region us-west-2 |
us-oeste-2 región es una de las regiones compatibles con API Gateway. Los nombres de los buckets S3 son únicos a nivel mundial, pero su ubicación es específica de cada región. Cargar
el código al cubo S3:
|
1 |
aws s3 cp microservice-http-endpoint/target/microservice-http-endpoint-1.0-SNAPSHOT.jar s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar |
El código se ha subido al bucket S3. La plantilla SAM está lista para ser desplegada.
Despliegue de la plantilla SAM
Despliegue la plantilla SAM:
|
1 2 3 4 |
aws cloudformation deploy --template-file template.yml --stack-name microservice-gateway --region us-west-2 |
Muestra la salida:
|
1 2 3 |
Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - microservice-gateway |
Este comando despliega funciones Lambda y recursos REST/API que activan estas funciones Lambda.
Invocar el microservicio
API Gateway publica una API REST que puede invocarse mediante curl, wget, AWS CLI/Console, Postman o cualquier otra aplicación que pueda llamar a una API REST. Este blog utilizará la consola de AWS para mostrar la interacción. Página de inicio de API Gateway en us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis espectáculos:

Haga clic en la API para ver todas las API de este recurso:

Haga clic en POST para ver la página por defecto para la ejecución del método POST:

Haga clic en Test para probar la API:
Añada la carga útil en el cuerpo de la solicitud y haga clic en Prueba para invocar la API. Los resultados se muestran a continuación:
Ahora haga clic en GET para ver la página de ejecución por defecto:

Haga clic en Test para probar la API:

No se necesita ningún cuerpo de solicitud, basta con hacer clic en Probar para invocar la API. Los resultados son los que se muestran:
La salida de la base de datos Couchbase se muestra en el cuerpo de la respuesta.



