Arquitetura Serverless 1: API Gateway, DynamoDB e Funções Lambda.

Raul Tavares
6 min readNov 23, 2020

--

Estando no mundo da tecnologia há quase uma década, é incrível ver todas as ferramentas disponíveis para nos ajudar a codificar, pensar e alcançar melhores resultados em nossa vida profissional. Atualmente, tenho mergulhado profundamente em muitos conceitos de desenvolvimento e arquitetura em nuvem dentro da AWS e aprendi muitas coisas boas para compartilhar por aqui.

Bom, a AWS tem muitos recursos que nos permitem criar soluções incríveis e flexíveis usando a abordagem de arquitetura serverless (ou seja, construir e executar aplicativos e serviços sem ter que gerenciar infraestrutura, enquanto seu código ainda é executado em servidores gerenciados pelo provedor de nuvem) .

Esta série de tutoriais irá guiá-lo pelas etapas para criar um microsserviço de API de gerenciamento de usuário simples, mas rápido e desacoplado, usando um banco de dados NoSQL, algumas funções de manipulação JSON e funções Lambda codificadas em Python para criar, ler, atualizar e excluir registros, tudo em execução sob o limite de uso do nível gratuito da AWS.

Primeiros passos!

Você pode usar o SDK da AWS e importar todos os pacotes para a sua solução e código no IDE de sua preferência, mas muito provavelmente, nos bastidores, o SDK chamará APIs em seu nome, e isso está OK se você quiser. Mas posso apontar três fatores que tornam a abordagem sem servidor mais bacana:

· Segurança: em vez de gerenciar suas credenciais em arquivos de configuração ou deixar hard-coded, você pode usar funções IAM diretamente no console AWS para conceder/negar permissões para os recursos de que precisa.

· Reutilização: você cria um endpoint e pode usá-lo em muitos projetos sem a necessidade de importar bibliotecas ou refatorar seu código.

· Custos: tudo que você precisa usar é baseado em nuvem, replicado para diferentes zonas de disponibilidade e custa muito menos do que uma infraestrutura local.

No final do dia, esta é uma nova tendência da arquitetura de sistemas e, além disso, é divertido descobrir novas maneiras de fazer as coisas. Portanto, faça login em seu console AWS e vamos lá!

Escopo

Você precisa gerenciar os usuários de sua empresa, cadastrando-os em um banco de dados com informações relevantes e depois recuperá-los, atualizá-los ou excluí-los posteriormente usando alguns parâmetros.

A tabela DynamoDB

Primeiramente, navegue até o console do DynamoDB e selecione Create Table.

Em seguida, dê um nome como Users, e defina username(string) como a chave primária. Deixe o resto das configurações padrão e escolha Create.

Políticas e Funções IAM

Coisa importante na AWS: privilégio mínimo! Suas APIs e funções do Lambda precisarão de permissões para integração entre si e para fazer coisas nos recursos, então vamos criar uma função para permitir que nossa função Lambda apenas insira coisas no DynamoDB.

Vá para o dashboard do IAM e escolha Roles -> Create Role.

Aí, escolha AWS Service como type, Lambda como use case e clique Next: Permissions.

Agora você precisa anexar uma política a essa função, que permitirá apenas a ação de inserção (PutItem) para o DynamoDB. Como isso não é criado por padrão, clique em Create Policy.

Na nova tela, use a informação abaixo:

· Service: DynamoDB
· Actions: PutItem
· Resources: Specific, então Add ARN, e use suas informações (Region: sua-regiao-X, Account: seu-account-id, Table Name: Users)

Clique em Add e depois em Review Policy.

Chame-a de DynamoDBPutItemOnly e clique Create Policy.

Uma vez feito isso, volte para a tela Create Role, atualize a lista clicando no ícone de duas setas, selecione a política DynamoDBPutItemOnly e clique em Next: Tags e em Next:Review.

Nomeie a função LambdaDynamoDBPutItemOnly e clique em Create role. E é isso!

Função Lambda

Navegue até a seção Lambda e escolha Create Function.

Depois, selecione Author from Scratch e preencha as informações abaixo, clicando em Create Function ao final.

· Function Name: InsertUser
· Runtime: Python 3.8
· Permissions: Use existing role -> LambdaDynamoDBPutItemOnly

Na seção Function Code, cole este código.

Por último, clique em Deploy.

O endpoint no API Gateway

Navegue até o painel do API Gateway e clique em Create API.

Escolha REST API e clique em Build.

Selecione New API, nomeie como Users, e na seção Endpoint Type deixe como Regional e clique em Create.

Você deve ser direcionado para a seção de recursos.

Clique em Actions e depois em Create Method. No pequeno menu suspenso que aparecerá, selecione POST e clique na marca de seleção ao lado dele.

A seguir, na página de configuração, preencha o formulário da seguinte forma:

· Integration Type: Lambda Function
· Lambda Region: sua-regiao
· Lambda Function: InsertUser

Então clique em Save.

Você deve ser solicitado a conceder permissões para o API Gateway invocar sua função Lambda. Clique em OK.

Hora de testar!

Na tela de Method Execution, clique em Test.

Na tela de teste, cole a seguinte informação no Request Body:

{
“user_login”:”raultavares”,
“user_pass”:”md5hashedpassword”,
“user_id”:”1",
“user_email”:”admin@raultavares.com”,
“user_fullname”:”Raul Tavares”,
“user_function”:”administrator”
}

Finalmente clique em Test.

A API Gateway deve retornar um Status 200, a Latency, que é o tempo de execução e o Response Body , que é o corpo da resposta especificado lá na função Lambda.

Você acabou de inserir seu primeiro registro na tabela Users. Brinque com isso apenas alterando as informações da solicitação JSON e preencha a tabela como desejar.

Implantando a API

Antes de implantar sua API para acesso público, lembre-se de que:

· É realmente recomendado que você estabeleça pelo menos um nível de autenticação para sua API, seja por meio de funções IAM, grupos de usuários Cognito ou autorizadores Lambda.

· Você pode mapear um nome de domínio personalizado para seu endpoint de API para torná-lo mais amigável ao desenvolvimento.

· É uma boa prática observar os logs do DynamoDB e Lambda, pois você pode reduzir custos ajustando a latência de leitura e gravação e o tempo de execução de execução de acordo com suas necessidades.

Então, quando estiver pronto, na tela Method Execution, clique em Actions e Deploy API.

Se você não tiver um ambiente de produção, na lista suspensa Deployment Stag, clique em New Stage, dê um nome a ele e clique em Deploy.

Conclusão

E é isso para a primeira parte !!

Agora você tem uma API funcional e pode chamá-la de qualquer aplicativo como Postman ou Swagger usando a URL Invoke. Esta API usa uma função Python simples rodando sem instalar nada e você pode integrá-la com qualquer outro software, desenvolvido em qualquer linguagem de codificação, usando apenas informações JSON.

Vejo vocês na segunda parte em breve! Obrigado!

--

--

Raul Tavares

Writer, technology professional, curious and creative.