O que é uma arquitetura sem servidor?
A arquitetura sem servidor executa código personalizado em contêineres efêmeros que são totalmente gerenciados por terceiros. Normalmente, o código personalizado é uma pequena parte de um aplicativo completo. Ela também é chamada de função. Isso dá outro nome para a arquitetura sem servidor, como Função como um serviço (FaaS). O contêiner é efêmero porque pode durar apenas uma invocação. O contêiner pode ser reutilizado, mas não é algo em que se possa confiar. Como desenvolvedor, você carrega o código na plataforma FaaS e o serviço cuida de toda a capacidade, dimensionamento, aplicação de patches e administração da infraestrutura para executar seu código.
Um aplicativo criado usando a arquitetura sem servidor segue a abordagem orientada por eventos. Por exemplo, uma atividade aconteceu no aplicativo, como um clique. Isso é muito diferente de uma arquitetura clássica em que o código do aplicativo é normalmente implantado em um servidor de aplicativos, como o Tomcat ou o WildFly. Dimensionar o seu aplicativo significa iniciar instâncias adicionais do servidor de aplicativos ou ativar contêineres adicionais com o servidor de aplicativos empacotado. O balanceador de carga precisa ser atualizado com os novos endereços IP. Os sistemas operacionais precisam ser corrigidos, atualizados e mantidos.
Arquiteturas sem servidor explique a diferença entre o modelo de programação clássico e essa nova arquitetura sem servidor. Com uma plataforma FaaS, seu aplicativo é dividido em várias funções. Cada função é implantada no FaaS. O serviço ativa instâncias de computação adicionais para atender às demandas de escalabilidade do seu aplicativo. As plataformas FaaS fornecem o ambiente de execução e cuidam da inicialização e da desativação dos contêineres para executar sua função.
Ler Arquiteturas sem servidor para obter mais detalhes sobre essas imagens. Uma das grandes vantagens do FaaS é que você só é cobrado pelo tempo de computação, ou seja, o tempo em que seu código está sendo executado. Não há cobrança quando seu código não está em execução. Qual é a diferença entre as funções e as VMs e os contêineres?
Observe que os contêineres do Linux, em vez dos contêineres do Docker, são usados como uma implementação para o AWS Lambda.
Qual é a diferença entre FaaS e PaaS?
Conforme citado em Arquiteturas sem servidorUma resposta rápida é fornecida pelo tweet a seguir:
Se a sua PaaS puder iniciar instâncias de forma eficiente em 20 ms que são executadas por meio segundo, chame-a de sem servidor. https://t.co/S3YzvqFYLR
- adrian cockcroft (@adrianco) 28 de maio de 2016
Em outras palavras, a maioria dos aplicativos de PaaS não é voltada para a ativação e desativação de aplicativos inteiros para cada solicitação, enquanto as plataformas de FaaS fazem exatamente isso. Abstraindo o back-end com FaaS explicar a diferença entre as diferentes ofertas de *aaS. A imagem do blog é capturada abaixo:
Arquiteturas sem servidor também fornecem grandes detalhes sobre o que é e o que não é FaaS. AWS Lambda, Funções do Google Cloud e Funções do Azure são algumas das opções para executar aplicativos sem servidor. Este blog mostrará como escrever sua primeira função AWS Lambda.
O que é o AWS Lambda?
O AWS Lambda é um serviço FaaS da Amazon Web Services. Ele executa seu código em uma infraestrutura de computação de alta disponibilidade e realiza toda a administração dos recursos de computação, incluindo manutenção de servidor e sistema operacional, provisionamento de capacidade e dimensionamento automático, monitoramento de código e registro. O AWS Lambda cobra pelo tempo de execução do seu código em incrementos de 100 ms. Não há custo associado ao armazenamento da função Lambda no AWS.
O primeiro milhão de solicitações por mês é gratuito e, depois disso, o preço é nominal. Leia mais detalhes em Preços Lambda. Ele também oferece visibilidade do desempenho, fornecendo métricas e registros em tempo real para AWS CloudWatch. Tudo o que você precisa fazer é escrever o código! Aqui está uma rápida introdução:
Confira também O que há de novo no AWS Lambda em AWS ReInvent 2016:
Confira também os padrões de arquitetura sem servidor e as práticas recomendadas do AWS ReInvent 2016:
O código que você executa no AWS Lambda é chamado de função Lambda. Você carrega seu código como um arquivo zip ou o projeta usando o Console de gerenciamento do AWS Lambda. Há um suporte integrado para o AWS SDK, o que simplifica a capacidade de chamar outros serviços do AWS. Em resumo, o Lambda é uma computação escalável, sem servidor, na nuvem. O AWS Lambda oferece vários ambientes de execução:
- 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á como fazer isso:
- Crie um aplicativo Java que armazene um documento JSON no Couchbase
- Use o Maven para criar um pacote de implantação para o aplicativo Java
- Criar uma função Lambda
- Atualizar a função Lambda
O código completo deste blog está disponível em github.com/arun-gupta/serverless/tree/master/aws/hellocouchbase.
Aplicativo Java para o AWS Lambda
Primeiro, vamos dar uma olhada em um aplicativo Java que será usado para essa função Lambda. Modelo de programação para funções Lambda em Java fornecem mais detalhes sobre como escrever seu código de função Lambda em Java. Nossa função Lambda implementará a interface predefinida com.amazonaws.services.lambda.runtime.RequestHandler
. O código tem a seguinte aparência:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
público classe HelloCouchbase implementa Solicitador<Solicitação, Cordas> { CouchbaseCluster agrupamento; Balde balde; LambdaLogger registrador; @Substituir público Cordas handleRequest(Solicitação solicitação, Contexto contexto) { SimpleDateFormat dateFormat = novo SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Cordas carimbo de data/hora = dateFormat.formato(Calendário.getInstance().getTime()); registrador = contexto.getLogger(); registrador.registro("Request received: %s" + carimbo de data/hora); ButtonDocument buttonDocument = novo ButtonDocument(); buttonDocument.setId(contexto.getAwsRequestId()); buttonDocument.setRequestId(contexto.getAwsRequestId()); buttonDocument.setTimestamp(Cordas.valueOf(carimbo de data/hora)); getBucket().upsert(buttonDocument.toJson()); retorno buttonDocument.toString(); } |
handleRequest
é onde o código da função é implementado. Contexto
fornece informações úteis sobre o ambiente de execução do Lambda. Algumas das informações do contexto são armazenadas em um documento JSON. Por fim, SDK Java do Couchbase API upsert
é usado para gravar um documento JSON na instância identificada do Couchbase. Couchbase no Amazon EC2 fornece instruções completas para instalar o Couchbase no AWS EC2. As informações sobre o servidor Couchbase são obtidas como:
1 2 3 4 5 6 7 |
público CouchbaseCluster getCluster() { se (nulo == agrupamento) { registrador.registro("env: " + Sistema.getenv("COUCHBASE_HOST")); agrupamento = CouchbaseCluster.criar(Sistema.getenv("COUCHBASE_HOST")); } retorno agrupamento; } |
Mais uma vez, isso está usando a API Java do Couchbase CouchbaseCluster como ponto de entrada principal para o cluster do Couchbase. O COUCHBASE_HOST
é passada quando a função Lambda é criada. No nosso caso, isso apontaria para um cluster do Couchbase de nó único em execução no AWS EC2. As variáveis de ambiente foram introduzidas recentemente no AWS Lambda. Por fim, você precisa acessar esse bucket no servidor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público Balde getBucket() { enquanto (nulo == balde) { registrador.registro("Tentando se conectar ao banco de dados"); balde = getCluster().openBucket("sem servidor", 2L, TimeUnit.MINUTAS); tentar { Tópico.dormir(3000); } captura (Exceção e) { registrador.registro("Exceção de sono de thread: " + e.toString()); lançar novo Exceção de tempo de execução(e); } } retorno balde; } |
O nome do bucket é sem servidor
e todos os documentos JSON são armazenados nele. Um simples Aplicativo Hello World também pode ser usado para criar essa função.
Criar pacote de implantação do AWS Lambda
O AWS FaaS precisa de um pacote de implantação. Esse pacote Lambda é um pacote .zip
ou .jar
que contém todas as dependências da função. Nosso aplicativo é empacotado usando o Maven e, portanto, usaremos um plug-in do Maven para criar um pacote de implantação. O aplicativo tem pom.xml
com o seguinte fragmento de plug-in:
1 2 3 4 5 6 7 8 9 10 11 |
org.apache.mentor.plugins mentor-sombra-plug-in 2.3 falso pacote sombra |
Mais detalhes sobre a configuração do Maven estão disponíveis em Criação de um pacote de implantação .jar usando o Maven sem nenhum IDE. O plug-in maven-shade permite que você crie um uber-jar incluindo todas as dependências. O sombra
está vinculado à meta pacote
fase. Portanto, a pacote mvn
gerará um único jar de implantação. Empacote o aplicativo usando o comando pacote mvn
comando. Isso mostrará a saída:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[INFORMAÇÕES] --- mentor-frasco-plug-in:2.4:frasco (padrão-frasco) @ base infernal --- [INFORMAÇÕES] Edifício frasco: /Usuários/arungupta/espaços de trabalho/sem servidor/aws/base infernal/base infernal/alvo/base infernal-1.0-FOTOGRAFIA.frasco [INFORMAÇÕES] [INFORMAÇÕES] --- mentor-sombra-plug-in:2.3:sombra (padrão) @ base infernal --- [INFORMAÇÕES] Incluindo com.amazonaws:aws-lambda-java-núcleo:frasco:1.1.0 em o sombreado frasco. [INFORMAÇÕES] Incluindo com.couchbase.cliente:java-cliente:frasco:2.3.6 em o sombreado frasco. [INFORMAÇÕES] Incluindo com.couchbase.cliente:núcleo-io:frasco:1.3.6 em o sombreado frasco. [INFORMAÇÕES] Incluindo io.reativox:rxjava:frasco:1.1.8 em o sombreado frasco. [INFORMAÇÕES] Substituição original artefato com sombreado artefato. [INFORMAÇÕES] Substituição /Usuários/arungupta/espaços de trabalho/sem servidor/aws/base infernal/base infernal/alvo/base infernal-1.0-FOTOGRAFIA.frasco com /Usuários/arungupta/espaços de trabalho/sem servidor/aws/base infernal/base infernal/alvo/base infernal-1.0-FOTOGRAFIA-sombreado.frasco [INFORMAÇÕES] ------------------------------------------------------------------------ [INFORMAÇÕES] CONSTRUIR SUCESSO [INFORMAÇÕES] ------------------------------------------------------------------------ |
O target/hello-couchbase-1.0-SNAPSHOT.jar
é o jar sombreado que será implantado no AWS Lambda. Mais detalhes sobre a criação de um pacote de implantação estão em Criação de um pacote de implantação.
Criar função AWS Lambda
Criar uma função AWS Lambda usando CLI DO AWS. O comando da CLI, nesse caso, tem a seguinte aparência:
1 2 3 4 5 6 7 8 9 10 11 |
aws lambda criar-função --função-nome HelloWorld --função arn:aws:iam:::função/serviço-função/myLambdaRole --zíper-arquivo arquivob:///Usuários/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar --manipulador org.amostra.sem servidor.aws.couchbase.HelloCouchbaseLambda --descrição "Olá, Couchbase Lambda" --tempo de execução java8 --região nós-oeste-2 --tempo limite 30 --memória-tamanho 1024 --publicar |
Nesta CLI:
função de criação
cria uma função Lambda--nome da função
fornece o nome da função. O nome da função diferencia maiúsculas de minúsculas.--Função
especifica o Amazon Resource Name (ARN) de um Função de IAM que o Lambda assume quando executa sua função para acessar quaisquer outros recursos da AWS. Se você executou uma função Lambda
usando o Console do AWS, essa função será criada para você.--zip-file
aponta para o pacote de implantação que foi criado na etapa anterior.arquivob
é um protocolo específico da CLI do AWS para indicar que o conteúdo carregado é binário.--manipulador
é a classe Java que é chamada para iniciar a execução da função-publicar
solicite ao AWS Lambda que crie a função Lambda e publique uma versão como uma operação atômica. Caso contrário, várias versões poderão ser criadas e publicadas em um momento posterior.
O Lambda Console mostra:
Teste a função Lambda do AWS
Teste a função Lambda do AWS usando a CLI do AWS.
1 2 3 4 5 |
aws lambda invocar --função-nome HelloCouchbaseLambda --região nós-oeste-2 --carga útil '' base infernal.fora |
Ele mostra a saída como:
1 2 3 |
{ "StatusCode": 200 } |
A saída do comando é armazenada em hellocouchbase.out
e se parece com isso:
1 |
"{"id":"e6bbe71a-ca4f-11e6-95a7-95f2ed410493","installationId":null,"requestId":"e6bbe71a-ca4f-11e6-95a7-95f2ed410493","identityId":null,"carimbo de data/hora":"2016-12-25 03:12:01.157"}" |
A chamada dessa função armazena um documento JSON no Couchbase. Os documentos armazenados no Couchbase podem ser vistos usando o console da Web do Couchbase. O nome de usuário é Administrador
e a senha é o ID da instância do EC2. Todos os buckets de dados nessa instância do Couchbase são mostrados abaixo:
Observe que o sem servidor
é criado manualmente. Clicar em Documentos mostra detalhes de diferentes documentos armazenados no compartimento:
Clicar em cada documento mostra mais detalhes sobre o documento JSON:
A função Lambda também pode ser testada usando o Console:
Atualizar a função AWS Lambda
Se a lógica do aplicativo mudar, um novo pacote de implantação precisará ser carregado para a função Lambda. Nesse caso, pacote mvn
criará um pacote de implantação e o aws lambda
O comando CLI é usado para atualizar o código de função:
1 2 3 4 5 |
aws lambda atualização-função-código --função-nome HelloCouchbaseLambda --zíper-arquivo arquivob:///Usuários/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar --região nós-oeste-2 --publicar |
Mostra o resultado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "CodeSha256": "w510ejw/OoVsQt2JiLG2bPZPAaFvQCRrYYYlQWctCQE=", "FunctionName": "HelloCouchbaseLambda", "CodeSize": 6978108, "MemorySize": 1024, "FunctionArn": "arn:aws:lambda:us-west-2::function:HelloCouchbaseLambda:8", "Ambiente": { "Variables" (Variáveis): { "COUCHBASE_HOST": "ec2-35-165-249-235.us-west-2.compute.amazonaws.com" } }, "Versão": "8", "Função": "arn:aws:iam:::role/service-role/myLambdaRole", "Tempo limite": 30, "LastModified": "2016-12-25T04:17:38.717+0000", "Manipulador": "org.sample.serverless.aws.couchbase.HelloCouchbaseLambda", "Tempo de execução": "java8", "Descrição": "Java Hello Couchbase" } |
A função pode então ser chamada novamente. Durante a redação deste blog, isso também foi usado com frequência para depurar a função. Isso ocorre porque as funções Lambda não têm nenhum estado ou caixa associado a elas. Portanto, você não pode fazer login em uma caixa para verificar se a função não foi implementada corretamente. Você certamente pode usar as declarações de registro do CloudWatch quando a função estiver funcionando.