Criando um aplicativo usando o Serverless Framework, AWS e BigQuery

Publicados: 2021-01-28

Serverless refere-se a aplicativos em que o gerenciamento e a alocação de servidores e recursos são gerenciados por um provedor de nuvem. Isso significa que o provedor de nuvem aloca os recursos dinamicamente. O aplicativo está sendo executado em um contêiner sem estado que pode ser acionado por um evento. Um desses exemplos acima e o que usaremos neste artigo é sobre o AWS Lambda .

Em resumo, podemos determinar “aplicativos sem servidor” como aplicativos que são sistemas baseados em nuvem orientados a eventos. O aplicativo depende de serviços de terceiros, lógica do lado do cliente e chamadas remotas (chamando-o diretamente de Function as a Service ).

Instalando o Serverless Framework e configurando-o para Amazon AWS

logotipo sem servidor

1. Estrutura sem servidor

O Serverless Framework é um framework de código aberto. Ele consiste em uma interface de linha de comando ou CLI e um painel hospedado, que nos fornece um sistema de gerenciamento de aplicativos totalmente sem servidor. O uso do Framework garante menos despesas gerais e custos, desenvolvimento e implantação rápidos e proteção dos aplicativos sem servidor.

Antes de prosseguir com a instalação do framework Serverless, você deve primeiro configurar o NodeJS. É muito fácil de fazer na maioria dos sistemas operacionais – você só precisa visitar o site oficial do NodeJS para baixá-lo e instalá-lo. Lembre-se de escolher uma versão superior a 6.0.0.

Após instalá-lo, você pode confirmar que o NodeJS está disponível executando node -v no console. Ele deve retornar a versão do nó que você instalou:

versão do nó

Agora você está pronto, então vá em frente e instale a estrutura Serverless.

Para fazer isso, siga a documentação para configurar e configurar o framework. Se preferir, você pode instalá-lo apenas para um projeto, mas no DevriX, geralmente instalamos o framework globalmente: npm install -g serverless

Aguarde a conclusão do processo e certifique-se de que o Serverless foi instalado com sucesso executando: serverless -v

informação sem servidor

2. Crie uma conta Amazon AWS

Antes de continuar a criar seu aplicativo de exemplo, você deve criar uma conta no Amazon AWS . Se você ainda não tem uma, basta acessar a Amazon AWS e clicar em “Create an AWS account” no canto superior direito e seguir os passos para criar uma conta.

Criar uma conta Amazon AWS

A Amazon exige que você insira um cartão de crédito, então você não pode continuar sem inserir essas informações. No registro e login bem-sucedidos, você deverá ver o Console de gerenciamento da AWS:

aws-console

Excelente! Vamos prosseguir agora com a criação de seu aplicativo.

3. Configure o Serverless Framework com o provedor da AWS e crie um aplicativo de exemplo

Nesta etapa, temos que configurar o framework Serverless com o provedor da AWS. Alguns serviços, como o AWS Lambda, exigem credenciais quando você os acessa para garantir que você tenha permissões para os recursos pertencentes a esse serviço. A AWS recomenda usar o AWS Identity and Access Manager (IAM) para fazer isso.

Então, a primeira e mais importante coisa é criar um usuário do IAM na AWS para usá-lo em nossa aplicação:

No console da AWS:

  • Digite IAM no campo “Localizar serviços” .
  • Clique em “IAM” .
  • Vá para “Usuários” .
  • Clique em “Adicionar usuário” .

iam-add-user

Para “Nome de usuário” use o que quiser. Por exemplo, estamos usando serverless-admin. Para “ Tipo de acesso” marque “Acesso programático” e clique em “Próximas permissões ”.

iam-add-user2

Depois disso, temos que anexar permissões para o usuário, clicar em “Anexar políticas existentes diretamente”, procurar por “Acesso de administrador” e clicar nele. Continue clicando em “Próximas tags”

iam-add-user3

As tags são opcionais, então você pode continuar clicando em “Próxima revisão” e “Criar usuário”. Uma vez feito e carregado, uma mensagem de sucesso aparece na página com as credenciais que precisamos.

iam-add-user4

Agora temos que executar o seguinte comando:
serverless config credentials --provider aws --key key --secret secret --profile serverless-admin
Substitua a chave e o segredo pelo fornecido acima. Suas credenciais da AWS são criadas como um perfil. Você pode verificar isso abrindo o arquivo ~/.aws/credentials . Ele deve consistir em perfis da AWS. Atualmente, no exemplo abaixo, é apenas um – o que criamos:

arquivo de credenciais aws

Ótimo trabalho até agora! Você pode continuar criando um aplicativo de exemplo usando NodeJS e os modelos de início integrados.

Nota: Além disso, no artigo, estamos usando o comando sls , que é a abreviação de serverless .
Crie um diretório vazio e insira-o. Execute o comando

ls create --template aws-nodejs

Usando o comando create –template , especifique um dos modelos disponíveis, neste caso, aws-nodejs, que é um aplicativo de modelo NodeJS “Hello world”.

sls-criar

Uma vez feito, seu diretório deve consistir no seguinte e se parecer com isso:

sls-create-files

Criamos os novos arquivos handler.js e serverless.yml .

O arquivo handler.js armazena suas funções e serverless.yml armazena as propriedades de configuração que você alterará posteriormente. Se você está se perguntando o que é o arquivo .yml , em suma, é uma linguagem de serialização de dados legível por humanos . É bom estar familiarizado com ele, pois é usado ao inserir qualquer parâmetro de configuração. Mas vamos dar uma olhada no que temos no arquivo serverless.yml agora:

 serviço: aws-sample-application
fornecedor:
  nome: aw
  tempo de execução: nodejs12.x
funções:
  Olá:
    manipulador: handler.hello
  • serviço: – Nosso nome de serviço.
  • provedor: – Um objeto que contém propriedades do provedor, e como vemos aqui, nosso provedor é AWS, e estamos usando o runtime NodeJS.
  • funções: – É um objeto que contém todas as funções que podem ser implantadas no Lambda. Neste exemplo, temos apenas uma função chamada hello que aponta para a função handler.js hello.

Você precisa fazer uma coisa crucial aqui antes de prosseguir com a implantação do aplicativo. Anteriormente, definimos as credenciais para AWS com um perfil (chamamos serverless-admin ). Agora tudo o que você precisa fazer é dizer à configuração sem servidor para usar esse perfil e sua região. Abra serverless.yml e sob a propriedade do provedor logo abaixo do tempo de execução, digite isto:

 perfil: serverless-admin
região: us-east-2

No final, devemos ter isso:

 fornecedor:
  nome: aw
  tempo de execução: nodejs12.x
  perfil: serverless-admin
  região: us-east-2

Observação: para obter a região, uma maneira fácil é pesquisar a URL quando você estiver logado no console: Exemplo:

aws-região

Agora que temos as informações necessárias sobre nosso template gerado. Vamos verificar como podemos invocar a função localmente e implantá-la no AWS Lambda.
Podemos testar imediatamente a aplicação invocando a função localmente:

sls invoke local -f hello

Ele invoca a função (mas apenas localmente!) e retorna a saída para o console:

sls-invoke-local

Agora, se tudo deu certo, você pode tentar implantar sua função no AWS Lambda .

Então foi complicado? Não, não foi! Graças ao Serverless Framework é apenas um código de uma linha:

sls deploy -v

Aguarde tudo terminar, pode demorar alguns minutos, se tudo estiver OK você deve terminar com algo assim:

sls-deploy-finished

Agora vamos verificar o que aconteceu na AWS. Vá para Lambda (em “ Find Services ” digite Lambda ), e você deverá ver sua função Lambda criada.

criado por aws-lambda

Agora você pode tentar invocar sua função do AWS Lambda. No tipo de terminal
sls invoke -f hello
Ele deve retornar a mesma saída anterior (quando testamos localmente):

sls-invoke

Você pode verificar se acionou a função da AWS abrindo a função no AWS Lambda e acessando a guia “ Monitoramento ” e clicando em “ Visualizar logs no CloudWatch. “.

lambda-cloudwatch-logs

Você deve ter um log lá.

Agora, uma coisa ainda está faltando em seu aplicativo, mas o que é isso...? Bem, você não tem um endpoint para acessar para seu aplicativo, então vamos criá-lo usando o AWS API Gateway.

Você precisa abrir o arquivo serverless.yml e limpar os comentários primeiro. Você precisa adicionar uma propriedade de eventos à nossa função e sob sua propriedade http . Isso informa à estrutura Serverless para criar um API Gateway e anexá-lo à nossa função Lambda ao implantar o aplicativo. Nosso arquivo de configuração deve terminar assim:

 serviço: aws-sample-application
fornecedor:
  nome: aw
  tempo de execução: nodejs12.x
  perfil: serverless-admin
  região: us-east-2
funções:
  Olá:
    manipulador: handler.hello
    eventos:
      - http:
          caminho: /olá
          método: obter

Em http especificamos o caminho e o método HTTP.
É isso, vamos implantar nosso aplicativo novamente executando sls deploy -v

Quando terminar, uma coisa nova deve aparecer no terminal de saída, e esse é o endpoint que foi criado:

ponto de extremidade http

Vamos abrir o endpoint:

http-endpoint-executado

Você deve ver que sua função está sendo executada, retornando a saída e algumas informações sobre a solicitação. Vamos verificar o que está mudando em nossa função Lambda.

Abra o AWS Lambda e clique em sua função.

aws-lambda-api-gateway

Vemos na guia “ Designer ” que temos o API Gateway anexado ao nosso Lambda e ao API Endpoint.

Excelente! Você criou um aplicativo sem servidor super simples, implantou-o no AWS Lambda e testou sua funcionalidade. Além disso, adicionamos um endpoint usando o AWS API Gateway .

4. Como executar o aplicativo offline

Até agora, sabemos que podemos invocar funções localmente, mas também podemos executar todo o nosso aplicativo offline usando o plugin serverless-offline.

O plug-in emula o AWS Lambda e o API Gateway em sua máquina local/de desenvolvimento. Ele inicia um servidor HTTP que trata das solicitações e invoca seus manipuladores.

Para instalar o plugin execute o comando abaixo no diretório do app

npm install serverless-offline --save-dev

Em seguida, dentro do serverless.yml do projeto, abra o arquivo e adicione a propriedade plugins :

 plug-ins:
  - off-line sem servidor

A configuração deve ficar assim:

 serviço: aws-sample-application
fornecedor:
  nome: aw
  tempo de execução: nodejs12.x
  perfil: serverless-admin
  região: us-east-2
funções:
  Olá:
    manipulador: handler.hello
    eventos:
      - http:
          caminho: /olá
          método: obter
plug-ins:
  - off-line sem servidor

Para verificar se instalamos e configuramos com sucesso o plugin, execute

sls --verbose

Você deve ver isso:

sls-verbose

Agora na raiz do seu projeto, execute o comando

sls offline

sls-offline

Como você pode ver, um servidor HTTP está escutando na porta 3000, e você pode acessar suas funções, por exemplo, aqui temos http://localhost:3000/dev/hello para nossa função hello. Abrindo que temos a mesma resposta do API Gateway , que criamos anteriormente.

sls-offline2

Adicionar integração do Google BigQuery

bigquery

Você fez um ótimo trabalho até agora! Você tem um aplicativo totalmente funcional usando o Serverless. Vamos estender nosso aplicativo e adicionar a integração do BigQuery a ele para ver como está funcionando e como a integração é feita.

O BigQuery é um software como serviço (SaaS) sem servidor, que é um armazenamento de dados rápido e econômico que oferece suporte a consultas. Antes de continuarmos integrando-o ao nosso aplicativo NodeJS, precisamos criar uma conta, então vamos prosseguir.

1. Configure o Console do Google Cloud

Acesse https://cloud.google.com e faça login com sua conta, caso ainda não tenha feito isso – crie uma conta e prossiga.

Ao fazer login no Google Cloud Console, você precisa criar um novo projeto. Clique nos três pontinhos ao lado do logo e abrirá uma janela modal onde você escolhe “ Novo projeto.

gc-create-project

Digite um nome para o seu projeto. Usaremos bigquery-example . Depois de criar o projeto, navegue até o BigQuery usando a gaveta:

gc-bq

Quando o BigQuery for carregado, no lado esquerdo, você verá os dados do projeto, aos quais você tem acesso, e também os conjuntos de dados públicos. Estamos usando um conjunto de dados público para este exemplo. É nomeado covid19_ecdc :

conjunto de dados bigquery-covid

Brinque com o conjunto de dados e as tabelas disponíveis. Visualize os dados nele. Esse é um conjunto de dados público que é atualizado a cada hora e contém informações sobre dados mundiais do COVID-19 .

Temos que criar um usuário do IAM -> Conta de serviço para poder acessar os dados. Portanto, no menu, clique em “IAM e administrador” e depois em “Contas de serviço”.

bq-conta de serviço

Clique no botão “Criar conta de serviço” , digite o nome da conta de serviço e clique em “Criar”. Em seguida, vá para “ Permissões da conta de serviço” , pesquise e escolha “Admin do BigQuery” .

bq-service-account-permissions

Clique em “ Continuar ”, este é o último passo, aqui você precisa de suas chaves, então clique no botão de criação em “ Chaves ” e exporte como JSON . Salve isso em algum lugar seguro, vamos precisar dele mais tarde. Clique em Concluído para concluir a criação da conta de serviço.

bigquery-service-account-criado

Agora, usaremos as credenciais geradas aqui para conectar a biblioteca NodeJS BigQuery.

2. Instale a biblioteca NodeJS BigQuery

Você precisará instalar a biblioteca NodeJS do BigQuery para usá-la no projeto que acabou de criar. Execute os comandos abaixo no diretório do aplicativo:

Primeiro, inicialize o npm executando npm init

Preencha todas as perguntas e prossiga com a instalação da biblioteca do BigQuery :
npm install @google-cloud/bigquery

Antes de continuarmos a alterar nosso manipulador de funções, precisamos carregar a chave privada do arquivo JSON que criamos anteriormente. Vamos usar variáveis ​​de ambiente Serverless para fazer isso. Você pode obter mais informações aqui.

Abra serverless.yml e, na propriedade do provedor , adicione a propriedade do ambiente como esta:

 meio Ambiente:
PROJECT_ID: ${file(./config/bigquery-config.json):project_id}
CLIENT_EMAIL: ${file(./config/bigquery-config.json):client_email}
PRIVATE_KEY: ${file(./config/bigquery-config.json):private_key}

Crie as variáveis ​​de ambiente PROJECT_ID, PRIVATE_KEY e CLIENT_EMAIL , que recebem as mesmas propriedades (minúsculas) do arquivo JSON que geramos. Nós o colocamos na pasta config e o nomeamos bigquery-config.json .

Agora, você deve acabar com o arquivo serverless.yml assim:

 serviço: aws-sample-application
fornecedor:
  nome: aw
  tempo de execução: nodejs12.x
  perfil: serverless-admin
  região: us-east-2
  meio Ambiente:
    PROJECT_ID: ${file(./config/bigquery-config.json):project_id}
    CLIENT_EMAIL: ${file(./config/bigquery-config.json):client_email}
    PRIVATE_KEY: ${file(./config/bigquery-config.json):private_key}
funções:
  Olá:
    manipulador: handler.hello
    eventos:
      - http:
          caminho: /olá
          método: obter
plug-ins:
  - off-line sem servidor

Agora abra handler.js e vamos importar a biblioteca do BigQuery, no topo do arquivo em 'use strict' adicione a seguinte linha:

const {BigQuery} = require('@google-cloud/bigquery');

Agora precisamos informar as credenciais à biblioteca do BigQuery. Para isso, crie uma nova constante que instancia o BigQuery com as credenciais:

 const bigQueryClient = new BigQuery({
    projectId: process.env.PROJECT_ID,
    credenciais: {
        client_email: process.env.CLIENT_EMAIL,
        private_key: process.env.PRIVATE_KEY
    }
});

Em seguida, vamos criar nossa consulta SQL do BigQuery. Queremos recuperar as informações mais recentes sobre os casos de COVID-19 na Bulgária. Estamos usando o editor de consultas do BigQuery para testá-lo antes de continuarmos. Por isso, criamos uma consulta personalizada:

 SELECT * FROM `bigquery-public-data.covid19_ecdc.covid_19_geographic_distribution_worldwide` WHERE geo_ ORDER BY data DESC LIMIT 1 

bigquery-query-results

Boa! Agora vamos implementar isso em nosso aplicativo NodeJS.
Abra handler.js e cole o código abaixo

 const query = 'SELECT * FROM `bigquery-public-data.covid19_ecdc.covid_19_geographic_distribution_worldwide` WHERE geo_id = \'BG\' ORDER BY data DESC LIMIT 1';
opções const = {
    consulta: consulta
}

const [job] = await bigQueryClient.createQueryJob(options);
const [linhas] = aguardar job.getQueryResults();

Criamos constantes de consulta e opções . Em seguida, continuamos executando a consulta como um trabalho e recuperando os resultados disso.

Vamos também alterar nosso manipulador de retorno para retornar as linhas geradas da consulta:

 Retorna {
    código de status: 200,
    corpo: JSON.stringify(
        {
            linhas
        },
        nulo,
        2
    ),
};

Vamos ver o handler.js completo:

 'usar estrito';

const {BigQuery} = require('@google-cloud/bigquery');
const bigQueryClient = new BigQuery({
    projectId: process.env.PROJECT_ID,
    credenciais: {
        client_email: process.env.CLIENT_EMAIL,
        private_key: process.env.PRIVATE_KEY
    }
});

module.exports.hello = evento assíncrono => {
    const query = 'SELECT * FROM `bigquery-public-data.covid19_ecdc.covid_19_geographic_distribution_worldwide` WHERE geo_id = \'BG\' ORDER BY data DESC LIMIT 1';
    opções const = {
        consulta: consulta
    }

    const [job] = await bigQueryClient.createQueryJob(options);
    const [linhas] = aguardar job.getQueryResults();

    Retorna {
        código de status: 200,
        corpo: JSON.stringify(
            {
                linhas
            },
            nulo,
            2
        ),
    };
};

OK! Vamos testar nossa função localmente:
sls invoke local -f hello
Devemos ver a saída:

bigquery-hello-invoke

Prossiga com a implantação do aplicativo para testá-lo via HTTP Endpoints, então execute sls deploy -v

Aguarde a conclusão e abra o endpoint. Aqui estão os resultados:

ponto de extremidade do bigquery

Bem feito! Agora temos um aplicativo para recuperar dados do BigQuery e retornar uma resposta. Vamos finalmente verificar se está funcionando offline. Executar sls offline

E carregue o endpoint local:

bigquery-offline

Trabalho bem feito. Estamos quase no final do processo. A última etapa é alterar um pouco o aplicativo e o comportamento. Em vez do AWS API Gateway , queremos usar o Application Load Balancer . Vamos ver como conseguir isso no próximo capítulo.

ALB – Application Load Balancer na AWS

Criamos nosso aplicativo usando o AWS API Gateway. Neste capítulo, abordaremos como substituir o API Gateway pelo Application Load Balancer (ALB).

Primeiro, vamos ver como o balanceador de carga do aplicativo funciona em comparação com o API Gateway:

No balanceador de carga de aplicativos, mapeamos um caminho(s) específico(s) (por exemplo, /hello/ ) para um grupo de destino – um grupo de recursos, no nosso caso, a função Lambda .

Um grupo de destino pode ter apenas uma função do Lambda associada a ele. Sempre que o grupo de destino precisa responder, o balanceador de carga do aplicativo envia uma solicitação ao Lambda e a função precisa responder com um objeto de resposta. Assim como o API Gateway, o ALB lida com todas as solicitações HTTP(s).

Existem algumas diferenças entre o ALB e o API Gateway . Uma diferença principal é que o API Gateway suporta apenas HTTPS (SSL), enquanto o ALB suporta HTTP e HTTPS.

Mas, vamos ver alguns prós e contras do API Gateway:

Gateway de API:

Prós:

  • Excelente segurança.
  • É simples de implementar.
  • É rápido para implantação e pronto para uso em um minuto.
  • Escalabilidade e disponibilidade.

Contras:

  • Pode se tornar bastante caro quando confrontado com alto tráfego.
  • Requer um pouco mais de orquestração, o que adiciona um nível de dificuldade para os desenvolvedores.
  • A degradação do desempenho, devido aos cenários da API, pode afetar a velocidade e a confiabilidade do aplicativo.

Vamos continuar criando um ALB e mudando para ele em vez de usar o API Gateway:

1. O que é ALB?

O balanceador de carga do aplicativo permite que o desenvolvedor configure e roteie o tráfego de entrada. É um recurso do “ Elastic Load Balancing”. Ele serve como o único ponto de contato para clientes, distribui o tráfego de aplicativos de entrada em vários destinos, como instâncias do EC2 em várias zonas.

2. Crie um Application Load Balancer usando a IU da AWS

Vamos criar nosso Application Load Balancer (ALB) por meio da interface do usuário no Amazon AWS. Faça login no Console AWS em “ Find services. ” digite “ EC2 ” e encontre “ Load Balancers.

aws-alb

Clique em “ Criar Load Balancer ”, em “ Application Load Balancer ”, escolha “ Criar ”. Para um nome, digite sua escolha, usamos “ amostra-alb”, escolha Esquema “ internet-facing ”, tipo de endereço IP ipv4.

Em “ Listeners ”, deixe como está – HTTP e porta 80. Pode ser configurado para HTTPS, embora você tenha que ter um domínio e confirmá-lo antes de poder usar HTTPS.

Zonas de disponibilidade – Para VPC , escolha a que você tem no menu suspenso e marque todas as “ Zonas de disponibilidade” :

aws-alb-create1

Clique em “ Next Configure Security Settings ” para solicitar que você melhore a segurança do seu balanceador de carga. Clique em Avançar.

Em " Etapa 3.Configurar grupos de segurança ", em Atribuir um grupo de segurança, escolha "Criar um novo grupo de segurança". Prossiga em seguida clicando em “ Next: Configure Routing. “. Na etapa 4, configure-o conforme mostrado na captura de tela acima:

roteamento aws-alb

Clique em Avançar , Avançar e Criar .

Volte para os load balancers e copie o ARN conforme mostrado na captura de tela:

aws-alb-arn

Agora temos que alterar nosso serverless.yml e remover a propriedade http do API Gateway. Na propriedade de eventos, remova a propriedade http e adicione uma propriedade alb. O objeto de função deve terminar assim:

 Olá:
  manipulador: handler.hello
  eventos:
    - alva:
        listenerArn: arn:aws:elasticloadbalancing:us-east-2:115129174008:listener/app/sample-alb/ae6e398a898c48e6/67ce6bf319d0513d
        prioridade: 1
        condições:
          caminho: /olá

Salve o arquivo e execute o comando para implantar o aplicativo
sls deploy -v

Após a implantação bem-sucedida, retorne aos AWS Load Balancers e encontre seu nome DNS, conforme mostrado na captura de tela:

aws-alb-dns

Copie o nome DNS e digite o caminho /hello .

Deve funcionar e, eventualmente, oferecer a opção de baixar conteúdo :). Até agora, o balanceador de carga do aplicativo está funcionando perfeitamente, mas o aplicativo precisa retornar uma resposta adequada para nossos usuários finais. Para fazer isso, abra handler.js e substitua a instrução return pela abaixo:

 Retorna {
    código de status: 200,
    statusDescrição: "200 OK",
    cabeçalhos: {
        "Content-Type": "application/json"
    },
    isBase64Encoded: false,
    corpo: JSON.stringify(linhas)
}

A diferença do ALB é que a resposta deve incluir container statusDescription, headers e isBase64Encoded. Salve o arquivo e implante novamente, mas desta vez não todo o aplicativo, mas apenas a função que alteramos. Execute o comando abaixo:
sls deploy -f hello

Dessa forma, estamos definindo apenas a função hello para deploy. Após a implantação com sucesso, visite o nome DNS com o caminho novamente e você deverá ter uma resposta adequada!

aws-alb-resposta

Excelente! Agora substituímos o API Gateway pelo Application Load Balancer. O balanceador de carga do aplicativo é mais barato que o API Gateway e agora podemos estender nosso aplicativo para atender às nossas necessidades, especialmente se esperamos ter um tráfego maior.

Palavras finais

Criamos um aplicativo simples usando o Serverless Framework, AWS e BigQuery e abordamos seu uso principal. Serverless é o futuro, e é fácil lidar com um aplicativo com ele. Continue aprendendo e mergulhe na estrutura Serverless para explorar todas as suas funcionalidades e os segredos que ela possui. É também uma ferramenta bastante simples e conveniente.