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
. HTTPOBTER
ePOST
são publicados para o recurso. - Cada API aciona uma função Lambda. Duas funções Lambda são criadas,
lista de livros
para listar todos os livros disponíveis ecriar livro
para 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 |
Versão do AWSTemplateFormat : '2010-09-09' Transformar: AWS::Serverless-2016-10-31 Descrição: Microsserviço usando o API Gateway, Lambda e Couchbase Recursos: MicroserviceGetAllGateway: Tipo: AWS::Sem servidor::Função Propriedades: Manipulador: org.sample.serverless.aws.couchbase.gateway.BucketGetAll Tempo de execução: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Tempo limite: 30 MemorySize: 1024 Meio ambiente: Variáveis: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com Função: arn:aws:iam::598307997273:role/microserviceRole Eventos: GetResource: Tipo: Api Propriedades: Caminho: /livros Método: get MicroservicePostGateway: Tipo: AWS::Sem servidor::Função Propriedades: Manipulador: org.sample.serverless.aws.couchbase.gateway.BucketPost Tempo de execução: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Tempo limite: 30 MemorySize: 1024 Meio ambiente: Variáveis: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com Função: arn:aws:iam::598307997273:role/microserviceRole Eventos: GetResource: Tipo: Api Propriedades: Caminho: /livros Método: 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::Function
atributo. O nome da função Lambda é definido porRecursos.
. - A classe de cada manipulador é definida pelo valor de
Recursos...Propriedades.Manipulador
atributo - O tempo de execução do Java 8 é usado para executar a função definida por
Recursos...Propriedades.Tempo de execução
atributo - 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_HOST
define 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.Method
atributo.
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 |
público classe BaldeGetAll implementa Solicitador<GatewayRequest, GatewayResponse> { @Substituir público GatewayResponse handleRequest(GatewayRequest solicitação, Contexto contexto) { tentar { N1qlQuery consulta = N1qlQuery .simples(selecionar("*") .de(i(CouchbaseUtil.getBucketName())) .limite(10)); Cordas resultado = CouchbaseUtil.getBucket().consulta(consulta).todas as linhas().toString(); retorno novo GatewayResponse(200, resultado, GatewayResponse.HEADERS_JSON); } captura (ConfigurationException e) { retorno novo 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 comoGatewayRequest
eGatewayResponse
aulas. - 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 emGatewayRequest
eGatewayResponse
.
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 |
público classe BucketPost implementa Solicitador<GatewayRequest, GatewayResponse> { @Substituir público GatewayResponse handleRequest(GatewayRequest solicitação, Contexto contexto) { tentar { JsonDocument documento = CouchbaseUtil.getBucket().upsert(Livro.fromStringToJson(solicitação.getBody())); retorno novo GatewayResponse(200, documento.conteúdo().toString(), GatewayResponse.HEADERS_JSON); } captura (Exceção ex) { retorno novo 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 emGatewayRequest
eGatewayResponse
.
Crie o aplicativo Java como:
1 |
mvn -f microsserviço-http-ponto final/pom.xml limpo pacote |
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 microsserviço-http-ponto final/alvo/microsserviço-http-ponto final-1.0-FOTOGRAFIA.frasco 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 formação de nuvens implantação --modelo-arquivo modelo.yml --pilha-nome microsserviço-portal --região nós-oeste-2 |
Ele mostra a saída:
1 2 3 |
Em espera para conjunto de alterações para ser criado.. Em espera para pilha criar/atualização para completo Com sucesso criado/atualizado pilha - microsserviço-portal |
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.