Como começar com a arquitetura sem servidor


Tradicionalmente, quando você desejava criar um aplicativo da Web ou API, normalmente precisava gastar tempo e esforço significativos gerenciando servidores e garantindo que o aplicativo fosse dimensionado para lidar com grandes volumes de solicitações. Serverless é um modelo de computação em nuvem que permite executar aplicativos sem se preocupar em gerenciar e dimensionar servidores.

Tudo o que você precisa fazer é enviar seu código para o serviço de um provedor de nuvem e eles provisionam automaticamente um ambiente efêmero. Diferentemente das arquiteturas tradicionais, ele pode ser dimensionado para lidar com milhares de solicitações em um instante, e você paga apenas pela duração durante a qual seu código é executado.

Neste artigo, criaremos um formulário de contato simples com a oferta sem servidor da AWS (Amazon Web Services), Lambda. No entanto, sem servidor é adequado para aplicativos de qualquer complexidade ou tamanho. Como exemplo, construímos myCompiler – um playground de programação que suporta 20 idiomas – e é amplamente alimentado por sem servidor.

Antes de começarmos, veremos mais de perto como o servidor e o Lambda funcionam e a arquitetura que vamos configurar para o nosso formulário de contato. Além disso, no final deste artigo, examinaremos algumas ferramentas destinadas a ajudar na criação e implantação de grandes aplicativos sem servidor.

Você precisará de uma conta da AWS para seguir este guia e pode se registrar aqui. Nosso uso da AWS neste guia será totalmente coberto pelo nível gratuito.

Como o AWS Lambda funciona?

Nesta seção, entenderemos o fluxo de trabalho com o Lambda e um breve entendimento de como ele funciona. No entanto, esses conceitos também se aplicam às ofertas sem servidor de outros provedores de nuvem.

Com o Lambda, você faz o upload do seu código para a AWS, que geralmente é um script escrito em Python, Node.js ou Ruby. No caso de uma linguagem como Go, Java ou C #, é um executável Linux ou um pacote no formato da linguagem (como arquivos jar para Java).

Após o upload do seu código, você poderá “invocá-lo” manualmente ou usar outro serviço da AWS para essa finalidade (veremos isso em detalhes em um momento). Quando você invoca seu código, o Lambda cria um ambiente Linux efêmero e seguro chamado “contêiner” em um de seus servidores, e quaisquer dados que você passou como parte da invocação são alimentados à sua função.

Depois que a função conclui a execução, o serviço Lambda retorna os resultados do código ao seu chamador. O contêiner pode ser reutilizado para servir outra execução ou, se a função não for chamada há muito tempo, o contêiner será destruído.

Quando você faz chamadas paralelas, o Lambda cria um contêiner para atender a cada chamada. Como cada chamada é dedicada a um único contêiner, cada chamada recebe amplos recursos para execução. Você pode atribuir de 128 MB a 3 GB de memória a cada chamada, juntamente com CPUs que aumentam com a memória. Combine isso com o fato de poder atender até mil invocações paralelas (isso pode ser aumentado entrando em contato com a AWS). Você pode lidar com cargas de trabalho pesadas sem ter que se preocupar com o dimensionamento.

Portanto, com as preocupações de dimensionamento fora do caminho, o que o AWS Lambda nos custa para executar? O uso do Lambda é medido usando os seguintes parâmetros: o número de solicitações, a memória alocada a ele e o número de milissegundos que suas funções levam para executar.

Se você escolher o menor tamanho de memória (128 MB) e suas funções levarem um segundo para serem executadas quando você a invocar, poderá invocar sua função até um milhão de vezes de graça. Depois disso, cada 1 milhão de invocações pode custar até US $ 2,30. Um tamanho de memória de 128 MB pode parecer pequeno, mas certamente é suficiente para lidar com muitos tipos de cargas de trabalho.

Gateway de API – Atendendo solicitações HTTP com o Lambda

Como mencionamos anteriormente, depois de fazer o upload do seu código, você deve invocá-lo manualmente. Para criar um aplicativo Web, você precisa ter um servidor que escute solicitações HTTP, invoque sua função com os detalhes da solicitação e traduza os dados retornados de sua função como uma resposta HTTP.

A AWS tem outro serviço que permite fazer exatamente isso – o gateway da API. Assim como o Lambda, é outro serviço gerenciado da AWS que pode ser escalado automaticamente para lidar com volumes de solicitação extremamente altos.

Depois de criar um gateway de API, você obterá um URL base parecido com este:
https://abcdefgh.execute-api.us-east-1.amazonaws.com/

Sob este URL base, você pode mapear caminhos e solicitar métodos (como GET ou POST) para suas funções. Você também tem a opção de criar seu domínio personalizado se desejar usar algo diferente do padrão, mas não abordaremos isso neste guia.

Além disso, assim como o Lambda, os preços do gateway de API também são ótimos – você pode atender até um milhão de solicitações de graça e depois disso a cada 1 milhão de solicitações custa US $ 1.

Criaremos um formulário de contato simples que nos envia um e-mail com os detalhes que nosso usuário preenche. É assim que elaboramos as várias partes do formulário de contato:

  1. Primeiro, configuraremos o SES (Simple Email Service), a oferta de email da AWS. Isso é para nos ajudar a enviar e-mails para o formulário de contato.
  2. Em seguida, configuraremos uma “função” para o Lambda e criaremos uma função do Lambda que receberá a solicitação HTTP e nos enviará um email.
  3. Vamos configurar o gateway da API e mapeá-lo para a função que criamos na etapa 2.
  4. Em seguida, configuraremos uma página da web que interaja com o ponto de extremidade do gateway da API e envie os detalhes preenchidos pelo usuário.

No final deste guia, você configurará algo que funciona assim:

Aplicativo sem servidor

Para começar, visite o Console de gerenciamento da AWS (ou simplesmente, o “console”) e faça o login com os detalhes que você usou para se inscrever. Depois de fazer o login, você pode usar o menu suspenso “Serviços” na barra de navegação para alternar entre os vários serviços que vamos usar.

Console de gerenciamento da AWS

Configurando o SES para enviar emails

Comece visitando a seção SES (Simple Email Service) do console no menu suspenso “Services” (Serviços) ou usando este link direto. Em seguida, clique na seção “Endereços de email” à esquerda. Você será recebido com esta página:

AWS SES

Clique no botão “Verificar um novo endereço de email” e, em seguida, digite seu endereço de email e clique em “Verificar este endereço de email”. Você receberá um e-mail com um link de verificação. Abra-o para verificar o endereço e atualize a página do console do SES. Você verá que o endereço de e-mail foi verificado:

AWS SES verificar endereço de email

Nesse momento, você poderá enviar e-mails para o seu endereço de e-mail usando o SES.

Configurando uma função para a função Lambda

Na AWS, a maioria das coisas começa sem permissões para interagir com outros recursos ou serviços em sua conta da AWS, a menos que você conceda permissões explícitas para isso.

Isso significa que nossa função Lambda não poderá conversar com serviços como o SES para enviar e-mails. O Lambda usa algo chamado “papel” para definir o nível de acesso que possui a outros serviços. Portanto, nesta seção, definiremos uma função para nossa função com acesso ao SES e CloudWatch. O CloudWatch é um serviço que armazena logs e métricas, e o Lambda o utiliza para armazenar erros e logs de execução para suas funções.

Para configurar a função, vá para a seção IAM (Gerenciamento de identidade e acesso) do console ou use este link diretoe clique em “Funções” à esquerda. Você verá uma página como a abaixo:

AWS IAM

Precisamos criar uma nova função, então clique em “Criar função”. Você verá uma página com uma lista de serviços da AWS. Como configuramos isso para o Lambda, selecione “Lambda” e clique no botão “Avançar: permissões”.

Entidade confiável da função da AWS

Agora, na página Permissões, você terá a opção de anexar políticas. Primeiro, concederemos permissões “SES” – e você pode fazer isso pesquisando “SES” e selecionando a política “AmazonSESFullAccess”.

Políticas de permissão da AWS

Da mesma forma, você pode conceder acesso ao CloudWatch pesquisando “CloudWatchFullAccess” e selecionando a política que aparece:

política de cloudwatch

Após selecionar essas políticas, clique em “Avançar: Tags” e, em seguida, no botão “Avançar: Revisar”. Na caixa de texto “Nome da função”, insira um nome de função de sua escolha, como “ContactFormRole”. Depois, clique no botão “Criar função”.

Função da AWS

Agora, temos uma função pronta para usar com nossa função Lambda.

Criando a função Lambda

Nesse ponto, podemos criar a função Lambda que recebe os detalhes do gateway da API e nos envia um email.

Para criar a função na seção Lambda do console, ou use este link direto. Clique em “Funções” no lado esquerdo. Nesta página, clique no botão “Criar função”.

criar função lambda

Na página de criação de função, você será solicitado a informar o nome da função e o idioma que deseja usar. Nomearemos nossa função “ContactFormFunction” e usaremos o Python 3.8 como idioma.

Em seguida, anexaremos a função que criamos na seção anterior. Clique em “Escolha ou crie uma função de execução” abaixo da seção “Permissões”, selecione “Usar uma função existente” e selecione a função que criamos anteriormente, “ContactFormRole”. Depois de inserir os detalhes, clique em o botão “Criar função”.

Isso o levará a uma página que mostra detalhes sobre sua função. Role um pouco para baixo para poder ver o editor de código, parecido com este:

No painel direito, cole o código a seguir e altere your_email_address_here com o seu endereço de email.

import boto3
from base64 import b64decode
from urllib.parse import parse_qs

# Replace your email address here
send_to = 'your_email_address_here'

def lambda_handler(event, context):
    # We receive our data through POST requests. API gateway
    # sends the POST data as a Base64 encoded string in
    # event['body'], so we must decode it.
    data = parse_qs(b64decode(event['body']).decode())

    subject = 'You got a message from %s' % data['email'][0]
    text = 'n'.join([
        'Name: %s' % data['name'][0],
        'Email: %s' % data['email'][0],
        'Message %s' % data['message'][0]
    ])

    # Send an email through SES with the SendEmail API
    client = boto3.client('ses', region_name='us-east-1')
    client.send_email(
        Source=send_to,
        Destination={'ToAddresses': [send_to]},
        Message={
            'Subject': {'Data': subject},
            'Body': {'Text': {'Data': text}}
        },
        ReplyToAddresses=[data['email'][0]]
    )

    # This is the response that'll be sent out through the
    # API gateway to the browser.
    return {
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Origin': '*'
        },
        'body': '"Success"' # jquery expects a JSON response
    }

Em seguida, clique no botão “Salvar” no canto superior direito para salvar seu código. Com isso fora do caminho, criaremos um gateway de API e o mapearemos com a função Lambda.

Manipulando Solicitações HTTP com Gateway API

Para adicionar um gateway de API e mapeá-lo para sua função, role para cima na página de funções Lambda até ver a seção “Designer” e clique no botão “Adicionar acionador”, como mostrado abaixo:

Isso abrirá a página de configuração “Trigger”. Os gatilhos são algo que pode chamar sua função Lambda e, como precisamos de um gateway de API, escolha-o no menu suspenso:

gatilho lambda

Isso exibirá várias opções para configurar o gateway da API. Verifique se você configurou a “API” para “Criar uma nova API” e “Escolha um modelo” para “API HTTP”:

API API criar API

Role para baixo e clique na função “Adicionar” para configurar o gateway da API. Isso leva alguns segundos para ser concluído e, uma vez concluído, você será direcionado para a visualização do designer. Clique no botão “API gateway” à esquerda para ver a URL através da qual você pode ativar a função Lambda:

Agora, antes de criar a página do formulário de contato, testaremos se nossa configuração até agora funciona corretamente. Se você estiver no MacOS, Linux ou uma versão recente do Windows 10, poderá copiar o URL do gateway da API mostrado acima e executar o seguinte comando no seu terminal. Certifique-se de substituir your_api_gateway_url com o URL real!

curl -i your_api_gateway_url --data-urlencode "name=John" --data-urlencode "email=john@example.com" --data-urlencode "message=hi there"

Se tudo correu bem, você pode ver uma resposta 200 OK com uma mensagem de “Sucesso”, da seguinte forma:

solicitação de ondulação

Você também deve receber um email em sua caixa de entrada intitulado “Você recebeu uma mensagem de john@example.com” com os detalhes que foram inseridos no formulário.

No entanto, isso às vezes pode ser complicado. O email pode ser entregue na sua pasta de spam ou, às vezes, até ser rejeitado sem que você nunca o veja. Isso ocorre porque provedores como o Gmail e o Yahoo impedem que terceiros (como o SES) enviem emails usando o nome de domínio.

Se você tiver seu próprio nome de domínio, poderá solucionar isso configurando um Registro SPF. No entanto, não discutiremos isso neste guia, pois queremos que você possa segui-lo mesmo sem um domínio.

Em seguida, concluiremos este guia criando a página do formulário de contato.

Abra seu editor de texto favorito e salve o seguinte código como um arquivo HTML. Lembre-se de substituir your_api_gateway_url com o URL completo que você obteve anteriormente.




  Formulário de Contato
  
  


  

Formulário de Contato


Depois de salvar o arquivo, abra-o no navegador, preencha os detalhes e clique em “Enviar”. Você poderá ver uma mensagem de sucesso, assim:

Formulário de Contato

Clicar no botão envia os detalhes como uma solicitação POST para o gateway da API, que aciona a função Lambda, que por sua vez nos envia um email pelo SES. No entanto, como discutimos na seção anterior (“Manipulando Solicitações HTTP com Gateway API”), você pode não receber um email em determinadas circunstâncias.

Agora que temos um formulário de contato que move a maior parte de sua lógica para sem servidor, você tem esta página estática da web que precisa hospedar em algum lugar.

Então, você precisa de um servidor para hospedar esta página? De modo nenhum! A AWS oferece um serviço de armazenamento chamado S3 (Simple Storage Service), e você pode usá-lo para hospedar sites estáticos. Isso requer um nome de domínio; portanto, se você possui um, pode usar Este artigo para hospedar a página da web.

Para onde ir a seguir?

Agora que criamos um formulário de contato simples usando o servidor, como você cria aplicativos grandes? Clicar em várias opções no console é uma boa maneira de aprender AWS e sem servidor, mas não é uma opção quando você está tentando criar algo grande com muitas partes móveis.

Felizmente, existem várias ferramentas que podem ajudá-lo a criar e implantar aplicativos sem servidor na AWS, como o Estrutura sem servidor ou AWS Chalice. CloudFormation, um serviço gratuito da AWS, também pode ajudar a criar aplicativos automatizando o processo de implantação por meio de modelos escritos em JSON ou YAML, embora seja um pouco difícil de usar do que as outras opções.



Fonte

Leave a Reply

Your email address will not be published. Required fields are marked *