Arquitetura Serverless 1: API Gateway, DynamoDB e Funções Lambda.
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!