{"id":27537965,"url":"https://github.com/0x03c1/fastapi-terraform-actions-aws","last_synced_at":"2026-04-07T09:32:16.819Z","repository":{"id":287761147,"uuid":"965709000","full_name":"RonierisonMaciel/fastapi-terraform-actions-aws","owner":"RonierisonMaciel","description":"Este projeto demonstra como fazer o deploy automatizado de uma aplicação web simples em FastAPI, utilizando Terraform com backend remoto na AWS (S3 + DynamoDB) e GitHub Actions para CI/CD, com execução final em uma instância EC2 com Docker.","archived":false,"fork":false,"pushed_at":"2025-04-15T22:24:01.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-15T23:24:41.978Z","etag":null,"topics":["aws","fastapi","python3","terraform"],"latest_commit_sha":null,"homepage":"","language":"Python","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/RonierisonMaciel.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,"zenodo":null}},"created_at":"2025-04-13T18:37:03.000Z","updated_at":"2025-04-15T22:24:04.000Z","dependencies_parsed_at":"2025-04-15T23:24:57.153Z","dependency_job_id":null,"html_url":"https://github.com/RonierisonMaciel/fastapi-terraform-actions-aws","commit_stats":null,"previous_names":["ronierisonmaciel/login","ronierisonmaciel/fastapi-terraform-actions-aws"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RonierisonMaciel%2Ffastapi-terraform-actions-aws","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RonierisonMaciel%2Ffastapi-terraform-actions-aws/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RonierisonMaciel%2Ffastapi-terraform-actions-aws/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RonierisonMaciel%2Ffastapi-terraform-actions-aws/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RonierisonMaciel","download_url":"https://codeload.github.com/RonierisonMaciel/fastapi-terraform-actions-aws/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249544027,"owners_count":21288850,"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":["aws","fastapi","python3","terraform"],"created_at":"2025-04-18T20:48:38.444Z","updated_at":"2025-12-30T22:56:25.091Z","avatar_url":"https://github.com/RonierisonMaciel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🖥️ FastAPI Login App - Deploy Automatizado com Terraform e GitHub Actions na AWS\n\nEste projeto demonstra como fazer o **deploy automatizado** de uma aplicação web simples em **FastAPI**, utilizando **Terraform** com backend remoto na AWS (S3 + DynamoDB) e **GitHub Actions** para CI/CD, com execução final em uma **instância EC2 com Docker**.\n\n---\n\n## 🚀 Funcionalidades\n\n- Aplicação de login com validação simples (`admin/1234`)\n- Deploy automático com GitHub Actions ao alterar o código\n- Provisionamento de infraestrutura na AWS com Terraform\n- Armazenamento remoto do estado no S3 com lock via DynamoDB\n- Evita reconstrução de instância se não houver alterações no Terraform\n- Execução da aplicação em contêiner Docker na EC2\n\n---\n\n## 📁 Estrutura do Projeto\n\n```\nprojeto-login-aws/\n├── app/\n│   ├── main.py\n│   ├── Dockerfile\n│   └── requirements.txt\n├── terraform/\n│   ├── main.tf\n│   ├── variables.tf\n│   └── outputs.tf\n└── .github/\n    └── workflows/\n        └── deploy.yml      # Workflow unificado (infra + app)\n```\n\n---\n\n## 🔧 Pré-requisitos\n\n- [Docker](https://app.docker.com/)\n- [Terraform](https://developer.hashicorp.com/terraform/install)\n- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)\n- Conta no [Docker Hub](https://hub.docker.com/)\n- Conta na [AWS](https://aws.amazon.com/)\n\n---\n\n## 🐳 Criando e publicando a imagem Docker\n\n```bash\ncd app\ndocker build -t SEU_USUARIO_DOCKER/login-app:latest .\ndocker login\ndocker push SEU_USUARIO_DOCKER/login-app:latest\n```\n\n---\n\n## ☁️ Criando uma chave SSH na AWS\n\n1. Acesse AWS Console → EC2 → **Key Pairs**\n2. Crie uma nova chave no formato `.pem` e salve localmente\n3. Anote o nome (ex.: `fastapi-key`) para usar no Terraform\n\n---\n\n## 🛠️ Configurando o backend remoto no Terraform\n\n\u003e A configuração abaixo server para resolver o problema da criação de uma nova instância a cada alteração no projeto. Mas lembre-se! Tem que alterar o arquivo `deploy-aws.yml` no workflow, deixei o source na raiz do repositório, caso haja interesse `deploy.yml`.\n\nNo arquivo `main.tf`:\n\n```hcl\nterraform {\n  backend \"s3\" {\n    bucket         = \"meu-bucket-terraform\"     # Substitua pelo nome real do bucket\n    key            = \"infra/terraform.tfstate\"\n    region         = \"us-east-1\"\n    dynamodb_table = \"terraform-locks\"\n    encrypt        = true\n  }\n}\n```\n\nCrie os recursos com:\n\n```bash\naws s3api create-bucket --bucket meu-bucket-terraform --region us-east-1\n\naws dynamodb create-table \\\n  --table-name terraform-locks \\\n  --attribute-definitions AttributeName=LockID,AttributeType=S \\\n  --key-schema AttributeName=LockID,KeyType=HASH \\\n  --billing-mode PAY_PER_REQUEST\n```\n\n---\n\n## ✍️ Configurando variáveis do Terraform\n\nNo arquivo `variables.tf`:\n\n```hcl\nvariable \"region\" {\n  default = \"us-east-1\"\n}\n\nvariable \"instance_type\" {\n  default = \"t2.micro\"\n}\n\nvariable \"ami\" {\n  default = \"ami-084568db4383264d4\"  # Ubuntu Server 22.04 LTS\n}\n\nvariable \"key_name\" {\n  default = \"fastapi-key\"\n}\n\nvariable \"docker_image\" {\n  default = \"SEU_USUARIO_DOCKER/login-app:latest\"\n}\n```\n\n---\n\n## 🔐 Configurando Secrets no GitHub\n\nAcesse seu repositório no GitHub:\n\n\u003e **Settings → Secrets and variables → Actions → New repository secret**\n\nAdicione os seguintes:\n\n| Nome                   | Valor                                                         |\n|------------------------|---------------------------------------------------------------|\n| `AWS_ACCESS_KEY_ID`    | Chave de acesso da AWS                                        |\n| `AWS_SECRET_ACCESS_KEY`| Chave secreta da AWS                                          |\n| `AWS_SSH_PRIVATE_KEY`  | Conteúdo da chave `.pem` criada na AWS                        |\n\n---\n\n## 🔄 Fluxo de Deploy com GitHub Actions (`deploy.yml`)\n\n- Executado em **todo push na branch `main`**\n- Detecta alterações em `terraform/` e executa `terraform apply` apenas se necessário\n- Estado da infraestrutura é armazenado em S3 (persistente entre execuções)\n- IP público é obtido com validação robusta\n- Código da aplicação é copiado via SCP e executado via SSH na EC2\n\n---\n\n## 🌐 Acessando a aplicação\n\nApós o deploy, acesse:\n\n```\nhttp://\u003cIP_PÚBLICO_DA_INSTÂNCIA\u003e\n```\n\n### 📥 Login de exemplo\n\n| Usuário | Senha |\n|---------|-------|\n| admin   | 1234  |\n\n---\n\n## 🧨 Remover recursos da AWS\n\nPara destruir a infraestrutura provisionada:\n\n```bash\ncd terraform\nterraform destroy -auto-approve\n```\n\n---\n\n## 🛠️ Possíveis erros e soluções\n\n| Erro                                                              | Solução                                                                 |\n|-------------------------------------------------------------------|-------------------------------------------------------------------------|\n| `InvalidGroup.Duplicate`                                          | Agora evitado com backend remoto no S3                                 |\n| `connection refused` no SSH                                       | Adicione `sleep 60` antes do SSH no GitHub Actions                     |\n| `unable to authenticate` no SSH                                   | Verifique se a chave privada no GitHub bate com a pública na AWS       |\n| `terraform output -raw ec2_public_ip` falha                       | Agora tratado com verificação robusta no workflow                      |\n| Container reiniciando mesmo sem mudanças                          | Pode ser otimizado usando `docker pull` e imagens versionadas          |\n\n---\n\n## 👨‍💻 Autor\n\nDesenvolvido por **Ronierison Maciel**  \n📧 [LinkedIn](https://linkedin.com/in/ronierisonmaciel) | [GitHub](https://github.com/ronierisonmaciel)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0x03c1%2Ffastapi-terraform-actions-aws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0x03c1%2Ffastapi-terraform-actions-aws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0x03c1%2Ffastapi-terraform-actions-aws/lists"}