Lançamento do Amazon Web Services Modelo de aplicativo sem servidorou SAM, há alguns meses. Ele define uma sintaxe simplificada para expressar
recursos sem servidor. O SAM estende AWS CloudFormation para adicionar suporte ao API Gateway, ao AWS Lambda e ao Amazon DynamoDB. Este blog mostrará como criar um microsserviço simples usando
SAM. É claro que usaremos Couchbase em vez de DynamoDB! Este blog também usará os conceitos básicos explicados em Microsserviço usando o AWS API Gateway, o AWS Lambda e o Couchbase. SAM
mostrará a facilidade com que toda a pilha de microsserviços pode ser implantada e gerenciada.
Para relembrar, aqui estão os principais componentes da arquitetura:
- O cliente pode ser curl, AWS CLI/Console, cliente Postman ou qualquer outra ferramenta/API que possa invocar um ponto de extremidade REST.
- O AWS API Gateway é usado para provisionar APIs. O recurso de nível superior está disponível no caminho
/livros. HTTPOBTERePOSTsão publicados para o recurso. - Cada API aciona uma função Lambda. Duas funções Lambda são criadas,
lista de livrospara listar todos os livros disponíveis ecriar livropara criar um novo livro. - O Couchbase é usado como um armazenamento de persistência no EC2. Todos os documentos JSON são armazenados e recuperados desse banco de dados.
Outros blogs sobre serverless:
- Microsserviço usando o AWS API Gateway, o AWS Lambda e o Couchbase
- Botão IoT do AWS, Lambda e Couchbase
- FaaS sem servidor com Lambda e Java
Vamos começar!
Modelo de aplicativo sem servidor (SAM)
Um modelo do AWS CloudFormation com recursos sem servidor em conformidade com o Modelo SAM da AWS é chamado de arquivo ou modelo SAM. Ele é implantado
como uma pilha do CloudFormation. Vamos dar uma olhada no nosso modelo SAM: Esse modelo está disponível em 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 |
Modelo SAM Especificação fornecer detalhes completos sobre o conteúdo do modelo. As partes principais do modelo são:
- Define dois recursos, ambos do tipo Lambda Function identificados por
AWS::Serverless::Functionatributo. O nome da função Lambda é definido porRecursos.. - A classe de cada manipulador é definida pelo valor de
Recursos...Propriedades.Manipuladoratributo - O tempo de execução do Java 8 é usado para executar a função definida por
Recursos...Propriedades.Tempo de execuçãoatributo - O código da classe é carregado em um bucket S3, no nosso caso, para
s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Recursos...Propriedades.Ambiente.Variáveis.COUCHBASE_HOSTdefine o host em que o Couchbase está sendo executado. Isso pode ser facilmente implantado no EC2, conforme explicado em Configurar o Couchbase.- Cada função Lambda é acionada por uma API. Ela é implantada usando o AWS API Gateway. O caminho é definido por
Eventos.GetResource.Properties.Path. O método HTTP é definido usandoEventos.GetResource.Properties.Methodatributo.
Aplicativo Java
O aplicativo Java que contém as funções Lambda está em github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint.
Função lambda que é acionada por HTTP GET é mostrado:
|
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); } } } |
Um pouco de explicação:
- Cada função Lambda precisa implementar a interface
com.amazonaws.services.lambda.runtime.RequestHandler. - A integração do API Gateway e do Lambda exige um formato de entrada e formato de saída.
Esses formatos são definidos comoGatewayRequesteGatewayResponseaulas. - A lógica da função usa SDK Java do Couchbase para consultar o banco de dados do Couchbase. N1QL A consulta é usada para consultar
o banco de dados. Os resultados e a exceção são então agrupados emGatewayRequesteGatewayResponse.
A função Lambda acionada pelo método HTTP POST também é bastante simples:
|
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); } } } |
Um pouco de explicação:
- A carga útil da solicitação de entrada é recuperada de
GatewayRequest - O documento inserido no Couchbase é retornado como resposta.
- Como no método anterior, a lógica Function usa SDK Java do Couchbase para consultar o banco de dados do Couchbase. Os resultados e a exceção são então
envolto emGatewayRequesteGatewayResponse.
Crie o aplicativo Java como:
|
1 |
mvn -f microservice-http-endpoint/pom.xml clean package |
Fazer upload da função Lambda para o S3
O modelo SAM lê o código de um bucket S3. Vamos criar um bucket S3:
|
1 |
aws s3 mb s3://serverless-microservice --region us-west-2 |
us-west-2 A região é uma das Regiões compatíveis com o API Gateway. Os nomes dos buckets S3 são globalmente exclusivos, mas sua localização é específica da região. Carregar
o código para o bucket 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 |
O código agora foi carregado no bucket S3. O modelo SAM está pronto para ser implantado!
Implantar o modelo SAM
Implante o modelo SAM:
|
1 2 3 4 |
aws cloudformation deploy --template-file template.yml --stack-name microservice-gateway --region us-west-2 |
Ele mostra a saída:
|
1 2 3 |
Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - microservice-gateway |
Esse comando implementa funções Lambda e recursos/APIs REST que acionam essas funções Lambda.
Invoque o microsserviço
O API Gateway publica uma API REST que pode ser chamada por curl, wget, AWS CLI/Console, Postman ou qualquer outro aplicativo que possa chamar uma API REST. Este blog usará o Console do AWS para mostrar a interação. Página inicial do API Gateway em us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis shows:

Clique na API para ver todas as APIs desse recurso:

Clique em POST para ver a página padrão para a execução do método POST:

Clique em Test para testar a API:
Adicione o payload no Request Body e clique em Teste para chamar a API. Os resultados são mostrados a seguir:
Agora, clique em GET para ver a página de execução padrão:

Clique em Test para testar a API:

Não é necessário nenhum corpo de solicitação, basta clicar em Testar para invocar a API. Os resultados são os mostrados:
A saída do banco de dados do Couchbase é mostrada no corpo da resposta.



