{"id":20414693,"url":"https://github.com/walterowisk/crud-apigateway-lambda-dynamodb","last_synced_at":"2026-05-10T03:40:39.283Z","repository":{"id":120617709,"uuid":"590491177","full_name":"walterowisk/CRUD-APIGateway-Lambda-DynamoDB","owner":"walterowisk","description":"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.","archived":false,"fork":false,"pushed_at":"2023-01-27T02:51:42.000Z","size":4106,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-24T16:03:27.484Z","etag":null,"topics":["api-gateway","api-http","aws","aws-lambda","dynamodb","postman"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/walterowisk.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-18T14:39:48.000Z","updated_at":"2023-04-24T00:49:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"32236a26-4355-46a5-8578-afe6ed61b224","html_url":"https://github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walterowisk%2FCRUD-APIGateway-Lambda-DynamoDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walterowisk%2FCRUD-APIGateway-Lambda-DynamoDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walterowisk%2FCRUD-APIGateway-Lambda-DynamoDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walterowisk%2FCRUD-APIGateway-Lambda-DynamoDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/walterowisk","download_url":"https://codeload.github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241959355,"owners_count":20049222,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-gateway","api-http","aws","aws-lambda","dynamodb","postman"],"created_at":"2024-11-15T06:11:57.039Z","updated_at":"2026-05-10T03:40:39.234Z","avatar_url":"https://github.com/walterowisk.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ch1  align=\"center\"\u003eAPI CRUD SERVERLESS COM API GATEWAY, AWS LAMBDA E DYNAMODB\u003c/h1\u003e\n\u003c/div\u003e\n\n## :package: Badge Stack\n\u003cdiv align=\"center\"\u003e \n\u003cimg src=\"https://img.shields.io/badge/Visual%20Studio%20Code-0078d7.svg?style=for-the-badge\u0026logo=visual-studio-code\u0026logoColor=white\" alt=\"Git badge\"/\u003e\n\u003cimg src=\"https://img.shields.io/badge/Amazon_AWS-FF9900?style=for-the-badge\u0026logo=amazonaws\u0026logoColor=white\" alt=\"Git badge\"/\u003e\n\u003cimg src=\"https://img.shields.io/badge/Amazon%20DynamoDB-4053D6?logo=Amazon%20DynamoDB\u0026logoColor=white\u0026style=for-the-badge\" alt=\"Git badge\"/\u003e\n\u003cimg src=\"https://img.shields.io/badge/Amazon%20API%20Gateway-FF4F8B.svg?style=for-the-badge\u0026logo=Amazon-API-Gateway\u0026logoColor=white\" alt=\"Git badge\"/\u003e\n\u003cimg src=\"https://img.shields.io/badge/AWS%20Lambda-FF9900.svg?style=for-the-badge\u0026logo=AWS-Lambda\u0026logoColor=white\" alt=\"Git badge\"/\u003e\n\u003cimg src=\"https://img.shields.io/badge/JavaScript-F7DF1E.svg?style=for-the-badge\u0026logo=JavaScript\u0026logoColor=black\" alt=\"Git badge\"/\u003e \n\u003cimg src=\"https://img.shields.io/badge/JSON-000000.svg?style=for-the-badge\u0026logo=JSON\u0026logoColor=white\" alt=\"Git badge\"/\u003e \n\u003cimg src=\"https://img.shields.io/badge/Postman-FF6C37.svg?style=for-the-badge\u0026logo=Postman\u0026logoColor=white\" alt=\"Git badge\"/\u003e \n\u003cimg src=\"https://img.shields.io/badge/GIT-E44C30?style=for-the-badge\u0026logo=git\u0026logoColor=white\" alt=\"Git badge\"/\u003e \n\u003cimg src=\"https://img.shields.io/badge/GitKraken-179287.svg?style=for-the-badge\u0026logo=GitKraken\u0026logoColor=white\" alt=\"Github Badge\"/\u003e \n\u003cimg src=\"https://img.shields.io/badge/GitHub-100000?style=for-the-badge\u0026logo=github\u0026logoColor=white\" alt=\"Github Badge\"/\u003e \n\u003c/div\u003e \n\n## :chart_with_upwards_trend: Diagrama do projeto\n\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB/blob/main/img/aws-diagram.png\" alt=\"AWS Diagram\" width=\"600\"\u003e \u003c/div\u003e \n\n## :cloud: Serviços AWS\n\n - **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.](https://aws.amazon.com/pt/api-gateway/)\n - **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.](https://aws.amazon.com/pt/lambda/)\n - **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.](https://aws.amazon.com/pt/dynamodb/) \n\n## :page_facing_up: Descrição do projeto\n\n\nCriaçã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.\n\nBasicamente 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.\n\nÉ interessante ressaltar que a API é executada de forma serverless, portanto, não há gerenciamento da infraestrutura e o sistema escala automaticamente.\n\n## :computer: Mão no console\nTodas as etapas deste projeto foram feitas diretamente no AWS Management Console. \n\n\u003e Todos os nomes `marcados como código` foram dados por mim e, portanto, ficam a critério de quem estiver reproduzindo o projeto.\n\nSem mais enrolação, let's go!!\n\n### 1. Criação de tabela no DynamoDB\nTabela para armazenar os dados enviados pelo Postman. Partition key recomendada com o tipo *number* ou *string*.\n\n - Abrir o console serviço DynamoDB.\n - Clicar em ***Create Table***.\n - Em ***Table name*** inserir `crud-lab`.\n - Em ***Partition key*** inserir `id` .\n - Rolar a página até o final e clicar em ***Create table***.\n\n### 2. Criação de uma função Lambda\nA 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.\n - Dentro do console do Lambda clicar em ***Create function***.\n - Deixar selecionada a opção ***Author from scratch*** para criar uma função do zero.\n - Em ***Function name*** inserir `crud-lab-lambda`.\n - Em ***Runtime*** selecionar *Node.js* na versão de sua preferência.\n - Deixar a opção Architecture em *x86_64*.\n - Em ***Permissions*** clicar em **Change default execution role** e marcar a opção *Create a new role from AWS policy templates*.\n - No campo ***Role name*** inserir `crud-lab-role`.\n - 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.\n - Clicar em ***Create function***.\n - Na tela a seguir clicar no editor de código do console e substiuir o script de teste pelo seu código. \n\n\u003e :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.\n\n - Depois de inserir o código *index.js* clicar em ***Deploy***.\n\n### 3. Criação da API HTTP\nSerá criada inicialmente uma API vazia para depois configurar as rotas e integrações com a função Lambda. Essa API fornecerá um endpoint HTTP.\n\n - Entrar no console do API Gateway e clicar em ***Create API***.\n - Selecionar ***HTTP API*** e clicar em ***Build***.\n - No campo ***API name*** inserir `crud-lab-api` e clicar em ***Next***.\n - Na tela ***Configure routes*** clicar em ***Next***.\n - Na tela ***Define stages*** deixar com o nome *$default* e clicar em ***Next***.\n - Na tela ***Review and create*** clicar em ***Create***.\n\n### 4. Criação das rotas\nSerã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.\nAs rotas são as seguintes:\n-   `PUT /items`\n-   `GET /items`\n-   `GET /items/{id}`\n-   `DELETE /items/{id}`\n\nPara criar as rotas basta executar os passos a seguir:\n\n - Dentro do console do ***API Gateway*** selecionar a API `crud-lab-api` criada anteriormente.\n -  Na barra lateral direita da tela clicar em ***Routes*** e na tela seguinte clicar em ***Create*** .\n - 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***.\n - Repetir o mesmo procedimento para a rota `GET /items`.\n - Fazer o mesmo procedimento para `GET /items/{id}`. Atentar para o caminho com o parâmetro `/{id}` no final.\n - A última rota é a `DELETE /items/{id}`.\n \n Assim ficarão as rotas:\n \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB/blob/main/img/routes.png\" alt=\"API Routes\" width=\"300\"\u003e \u003c/div\u003e \n\n### 5. Criar a integração\nConectar as rotas criadas com o Lambda.\n\n - Dentro do console da API criada clicar em ***Integrations*** na barra lateral direita.\n - Em seguida clicar na aba ***Manage integrations*** e depois em ***Create***.\n - Na tela ***Create an integration*** ir direto para a opção ***Integration target/Integration type*** selecionar a opção *Lambda function* \n- Mais abaixo, em ***Lambda Function***, selecionar `crud-lab-lambda`e a seguir clicar em ***Create***.\n\n### 6. Anexar a integração com as rotas\nSerá utilizada a mesma integração para todas as rotas.\n\n - Dentro da tela ***Integrations*** da API clique na aba ***Attach integrations to routes***.\n - Clicar em uma das rotas (PUT/GET/DELETE/GET) e logo ao lado clicar no campo ***Choose an existing integration***.\n - Selecionar a opção `crud-lab-lambda` e clicar em ***Attach integration***.\n - Repetir essa integração para todas as rotas.\n\nApó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.\n\n\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB/blob/main/img/integrations.png\" alt=\"Integrations\" width=\"300\"\u003e \u003c/div\u003e \n\n### 7. Testar a API\nConforme já mencionado os testes foram feitos com o Postman, um API Client muito popular entre os desenvolvedores.\nOs testes foram feitos na seguinte sequência:\n - **Criar ou atualizar um item (`PUT /items`):**\n \n\t Endpoint: https://491xm45qxb.execute-api.us-east-1.amazonaws.com/items\n\t \n\t Corpo: `{\"id\": \"123\", \"price\": 178, \"name\": \"tenis nike\"}`\n\t \n\t Retorno: `\"Item adicionado: 123\"`\n \n - **Solicitar todos os itens (`GET /items`):**\n \n\t  Endpoint: https://491xm45qxb.execute-api.us-east-1.amazonaws.com/items\n\t  \n\t  Retorno:\n  ```json\n{\n    \"Items\": [\n        {\n            \"price\": 178,\n            \"id\": \"123\",\n            \"name\": \"tenis nike\"\n        }\n    ],\n    \"Count\": 1,\n    \"ScannedCount\": 1\n}\n```\n - **Solicitar um item específico (`GET /items/{id}`):**\n \n\tEndpoint: https://491xm45qxb.execute-api.us-east-1.amazonaws.com/items/123\n\t\n\tRetorno:\n```json\n{\n    \"Item\": {\n        \"price\": 178,\n        \"id\": \"123\",\n        \"name\": \"tenis nike\"\n    }\n}\n```\n - **Excluir um item específico (`DELETE /items/{id}`):**\n \n\tEndpoint: https://491xm45qxb.execute-api.us-east-1.amazonaws.com/items/123\n\t\n\tRetorno: `\"Item deletado: 123\"`\n\n### :eyes: Gif preview\n \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/walterowisk/CRUD-APIGateway-Lambda-DynamoDB/blob/main/img/crud-api-postman.gif\" alt=\"Gif Test API Postman\" width=\"620\"\u003e \u003c/div\u003e \n\n---\n\n\u003e :bulb: Importante: Não esquecer de excluir os recursos criados para evitar cobranças desnecessárias da AWS.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalterowisk%2Fcrud-apigateway-lambda-dynamodb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwalterowisk%2Fcrud-apigateway-lambda-dynamodb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalterowisk%2Fcrud-apigateway-lambda-dynamodb/lists"}