[AWS]: API CRUD Serverless com API Gateway, Lambda e DynamoDB


:package: Badge Stack

:chart_with_upwards_trend: Diagrama do projeto

:cloud: Serviços AWS

  • API GATEWAY: Serviço gerenciado que permite criação, publicação, manutenção, monitoramento e proteção de APIs REST e WebSocket em qualquer escala. Saiba mais.
  • LAMBDA: Serviço de computação sem servidor e orientado a eventos que permite executar código para praticamente qualquer tipo de aplicação ou serviço de backend sem provisionar ou gerenciar servidores. Saiba mais.
  • DYNAMODB: Banco de dados de chave-valor NoSQL, sem servidor e totalmente gerenciado, projetado para executar aplicações de alta performance em qualquer escala. Saiba mais.

:page_facing_up: Descrição do projeto

Criação de uma API CRUD serverless usando API Gateway, Lambda e DynamoDB. Essa API cria, lê, atualiza e exclui itens de uma tabela por meio de requisições feitas através do Postman.

Basicamente o fluxo do projeto consiste na criação de uma tabela no DynamoDB. Em seguida, cria-se uma função Lambda e logo depois cria-se uma API HTTP usando API Gateway. Para finalizar são realizados os testes invocando a API que por sua vez solicita a função do Lambda que interage com o DynamoDB. A tabela responde ao API Gateway que retorna o resultado ao Postman.

É interessante ressaltar que a API é executada de forma serverless, portanto, não há gerenciamento da infraestrutura e o sistema escala automaticamente.

:computer: Mão no console

Todas as etapas deste projeto foram feitas diretamente no AWS Management Console.

Todos os nomes marcados como código foram dados por mim e, portanto, ficam a critério de quem estiver reproduzindo o projeto.

Sem mais enrolação, let's go!!

1. Criação de tabela no DynamoDB

Tabela para armazenar os dados enviados pelo Postman. Partition key recomendada com o tipo number ou string.

  • Abrir o console serviço DynamoDB.
  • Clicar em Create Table.
  • Em Table name inserir crud-lab.
  • Em Partition key inserir id .
  • Rolar a página até o final e clicar em Create table.

2. Criação de uma função Lambda

A documentação da AWS recomenda a criação de funções separadas para cada rota, mas neste projeto será utilizada uma única função Lambda.

  • Dentro do console do Lambda clicar em Create function.
  • Deixar selecionada a opção Author from scratch para criar uma função do zero.
  • Em Function name inserir crud-lab-lambda.
  • Em Runtime selecionar Node.js na versão de sua preferência.
  • Deixar a opção Architecture em x86_64.
  • Em Permissions clicar em Change default execution role e marcar a opção Create a new role from AWS policy templates.
  • No campo Role name inserir crud-lab-role.
  • Em Policy templates marcar a opção Simple microservice permissions para que a função Lambda tenha permissão de se comunicar com o DynamoDB.
  • Clicar em Create function.
  • Na tela a seguir clicar no editor de código do console e substiuir o script de teste pelo seu código.

:bulb: Caso utilize o arquivo index.js anexado a este repositório não esqueça de ajustar o nome da tabela se necessário for.

  • Depois de inserir o código index.js clicar em Deploy.

3. Criação da API HTTP

Será criada inicialmente uma API vazia para depois configurar as rotas e integrações com a função Lambda. Essa API fornecerá um endpoint HTTP.

  • Entrar no console do API Gateway e clicar em Create API.
  • Selecionar HTTP API e clicar em Build.
  • No campo API name inserir crud-lab-api e clicar em Next.
  • Na tela Configure routes clicar em Next.
  • Na tela Define stages deixar com o nome $default e clicar em Next.
  • Na tela Review and create clicar em Create.

4. Criação das rotas

Serão criadas quatro rotas para envio de solicitações de API para o backend da aplicação, papel desempenhado pela função Lambda. Está anexado a este repositório o arquivo .json da collection exportada do Postman para eventuais consultas. As rotas são as seguintes:

  • PUT /items
  • GET /items
  • GET /items/{id}
  • DELETE /items/{id}

Para criar as rotas basta executar os passos a seguir:

  • Dentro do console do API Gateway selecionar a API crud-lab-api criada anteriormente.
  • Na barra lateral direita da tela clicar em Routes e na tela seguinte clicar em Create .
  • Ao entrar na tela Create a route na função Route and method selecionar o método PUT e logo ao lado do método inserir o caminho /items e em seguida clicar em Create.
  • Repetir o mesmo procedimento para a rota GET /items.
  • Fazer o mesmo procedimento para GET /items/{id}. Atentar para o caminho com o parâmetro /{id} no final.
  • A última rota é a DELETE /items/{id}.

Assim ficarão as rotas:

5. Criar a integração

Conectar as rotas criadas com o Lambda.

  • Dentro do console da API criada clicar em Integrations na barra lateral direita.
  • Em seguida clicar na aba Manage integrations e depois em Create.
  • Na tela Create an integration ir direto para a opção Integration target/Integration type selecionar a opção Lambda function
  • Mais abaixo, em Lambda Function, selecionar crud-lab-lambdae a seguir clicar em Create.

6. Anexar a integração com as rotas

Será utilizada a mesma integração para todas as rotas.

  • Dentro da tela Integrations da API clique na aba Attach integrations to routes.
  • Clicar em uma das rotas (PUT/GET/DELETE/GET) e logo ao lado clicar no campo Choose an existing integration.
  • Selecionar a opção crud-lab-lambda e clicar em Attach integration.
  • Repetir essa integração para todas as rotas.

Após realizar todas as integrações as rotas ficarão de acordo com a imagem abaixo. Com esse passo conluído já é possível realizar os testes de API.

7. Testar a API

Conforme já mencionado os testes foram feitos com o Postman, um API Client muito popular entre os desenvolvedores. Os testes foram feitos na seguinte sequência:

{
  "Items": [
      {
          "price": 178,
          "id": "123",
          "name": "tenis nike"
      }
  ],
  "Count": 1,
  "ScannedCount": 1
}
{
    "Item": {
        "price": 178,
        "id": "123",
        "name": "tenis nike"
    }
}

:eyes: Gif preview


:bulb: Importante: Não esquecer de excluir os recursos criados para evitar cobranças desnecessárias da AWS.


Que projeto irado! Muito bom, obrigado por compartilhar!

Fico feliz que tenha gostado. Foi a primeira vez que fiz algo do tipo. Vamo que vamo!