{"id":25970588,"url":"https://github.com/aureliodeboa/devops_vexpenses","last_synced_at":"2026-05-19T14:33:23.128Z","repository":{"id":280696955,"uuid":"942279568","full_name":"aureliodeboa/DevOps_VEXPENSES","owner":"aureliodeboa","description":"Desafio técnico Vexpenses","archived":false,"fork":false,"pushed_at":"2025-03-05T14:36:25.000Z","size":69,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-19T08:45:10.472Z","etag":null,"topics":["aws","ec2","rsa","ssh","terraform","wsl-ubuntu"],"latest_commit_sha":null,"homepage":"","language":"HCL","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/aureliodeboa.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-03-03T21:26:37.000Z","updated_at":"2025-03-05T14:36:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"af7d8cd0-1ab9-49f1-b60c-826e3c174d13","html_url":"https://github.com/aureliodeboa/DevOps_VEXPENSES","commit_stats":null,"previous_names":["aureliodeboa/devops_vexpenses"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aureliodeboa/DevOps_VEXPENSES","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aureliodeboa%2FDevOps_VEXPENSES","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aureliodeboa%2FDevOps_VEXPENSES/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aureliodeboa%2FDevOps_VEXPENSES/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aureliodeboa%2FDevOps_VEXPENSES/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aureliodeboa","download_url":"https://codeload.github.com/aureliodeboa/DevOps_VEXPENSES/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aureliodeboa%2FDevOps_VEXPENSES/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276582112,"owners_count":25667818,"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","status":"online","status_checked_at":"2025-09-23T02:00:09.130Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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","ec2","rsa","ssh","terraform","wsl-ubuntu"],"created_at":"2025-03-04T23:18:07.876Z","updated_at":"2025-09-23T13:18:39.667Z","avatar_url":"https://github.com/aureliodeboa.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Infraestrutura na AWS Desafio técnico Vexpenses\n\nEsse repositorio é fruto de um desafio tecnico feito para uma vaga de DevOps para Vexpenses e este readme foi construido tendo em vista cumprir todos os requisitos solicitados.\n\n## Descrição Técnica do Código Terraform dado\n\n### Provider AWS\n```hcl\nprovider \"aws\" {\n  region = \"us-east-1\"\n}\n```\n- **Função**: Define o provedor AWS e a região onde os recursos serão criados.\n- **Detalhes**: O provedor AWS é configurado para usar a região `us-east-1`.\n\n### Variáveis\n```hcl\nvariable \"projeto\" {\n  description = \"Nome do projeto\"\n  type        = string\n  default     = \"VExpenses\"\n}\n\nvariable \"candidato\" {\n  description = \"Nome do candidato\"\n  type        = string\n  default     = \"SeuNome\"\n}\n```\n- **Função**: Define variáveis que podem ser reutilizadas em todo o código.\n- **Detalhes**:\n  - `projeto`: Armazena o nome do projeto, com valor padrão `\"VExpenses\"`.\n  - `candidato`: Armazena o nome do candidato, com valor padrão `\"SeuNome\"`.\n\n### Chave Privada e Key Pair\n```hcl\nresource \"tls_private_key\" \"ec2_key\" {\n  algorithm = \"RSA\"\n  rsa_bits  = 2048\n}\n\nresource \"aws_key_pair\" \"ec2_key_pair\" {\n  key_name   = \"${var.projeto}-${var.candidato}-key\"\n  public_key = tls_private_key.ec2_key.public_key_openssh\n}\n```\n- **Função**: Gera uma chave privada RSA (criptografia assimetrica) e cria um key pair.\n- **Detalhes**:\n  - `tls_private_key`: Gera uma chave privada RSA de 2048 bits.\n  - `aws_key_pair`: Cria uma chave publica   usando a chave privada gerada. Temos assim o par de chaves.\n\n### VPC\n```hcl\nresource \"aws_vpc\" \"main_vpc\" {\n  cidr_block           = \"10.0.0.0/16\"\n  enable_dns_support   = true\n  enable_dns_hostnames = true\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-vpc\"\n  }\n}\n```\n- **Função**: Cria uma VPC (Virtual Private Cloud) na AWS.\n- **Detalhes**:\n  - `cidr_block`: Define o bloco CIDR da VPC como `10.0.0.0/16`.\n  - `enable_dns_support` e `enable_dns_hostnames`: Habilitam suporte a DNS e nomes de host.\n  - `tags`: Adiciona tags para identificação.\n\n### Subnet\n```hcl\nresource \"aws_subnet\" \"main_subnet\" {\n  vpc_id            = aws_vpc.main_vpc.id\n  cidr_block        = \"10.0.1.0/24\"\n  availability_zone = \"us-east-1a\"\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-subnet\"\n  }\n}\n```\n- **Função**: Cria uma subnet dentro da VPC.\n- **Detalhes**:\n  - `vpc_id`: Associa a subnet à VPC criada.\n  - `cidr_block`: Define o bloco CIDR da subnet como `10.0.1.0/24`.\n  - `availability_zone`: Define a zona de disponibilidade como `us-east-1a`.\n  - `tags`: Adiciona tags para identificação.\n\n### Internet Gateway\n```hcl\nresource \"aws_internet_gateway\" \"main_igw\" {\n  vpc_id = aws_vpc.main_vpc.id\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-igw\"\n  }\n}\n```\n- **Função**: Cria um Internet Gateway e o associa à VPC (para dar acesso a internet).\n- **Detalhes**:\n  - `vpc_id`: Associa o Internet Gateway à VPC criada.\n  - `tags`: Adiciona tags para identificação.\n\n### Route Table\n```hcl\nresource \"aws_route_table\" \"main_route_table\" {\n  vpc_id = aws_vpc.main_vpc.id\n\n  route {\n    cidr_block = \"0.0.0.0/0\"\n    gateway_id = aws_internet_gateway.main_igw.id\n  }\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-route_table\"\n  }\n}\n```\n- **Função**: Cria uma tabela de rotas e define uma rota padrão para o Internet Gateway.\n- **Detalhes**:\n  - `vpc_id`: Associa a tabela de rotas à VPC criada.\n  - `route`: Define uma rota para todo o tráfego (`0.0.0.0/0`) para o Internet Gateway.\n  - `tags`: Adiciona tags para identificação.\n\n### Route Table Association\n```hcl\nresource \"aws_route_table_association\" \"main_association\" {\n  subnet_id      = aws_subnet.main_subnet.id\n  route_table_id = aws_route_table.main_route_table.id\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-route_table_association\"\n  }\n}\n```\n- **Função**: Associa a subnet à tabela de rotas.\n- **Detalhes**:\n  - `subnet_id`: Associa a subnet criada.\n  - `route_table_id`: Associa a tabela de rotas criada.\n  - `tags`: Adiciona tags para identificação.\n\n### Security Group\n```hcl\nresource \"aws_security_group\" \"main_sg\" {\n  name        = \"${var.projeto}-${var.candidato}-sg\"\n  description = \"Permitir SSH de qualquer lugar e todo o tráfego de saída\"\n  vpc_id      = aws_vpc.main_vpc.id\n\n  ingress {\n    description      = \"Allow SSH from anywhere\"\n    from_port        = 22\n    to_port          = 22\n    protocol         = \"tcp\"\n    cidr_blocks      = [\"0.0.0.0/0\"]\n    ipv6_cidr_blocks = [\"::/0\"]\n  }\n\n  egress {\n    description      = \"Allow all outbound traffic\"\n    from_port        = 0\n    to_port          = 0\n    protocol         = \"-1\"\n    cidr_blocks      = [\"0.0.0.0/0\"]\n    ipv6_cidr_blocks = [\"::/0\"]\n  }\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-sg\"\n  }\n}\n```\n- **Função**: Cria um grupo de segurança para controlar o tráfego de entrada e saída.\n- **Detalhes**:\n  - `ingress`: Permite tráfego SSH (porta 22) de qualquer lugar. (vunerabilidade)\n  - `egress`: Permite todo o tráfego de saída.\n  - `tags`: Adiciona tags para identificação.\n\n\n### AMI Debian 12\n```hcl\ndata \"aws_ami\" \"debian12\" {\n  most_recent = true\n\n  filter {\n    name   = \"name\"\n    values = [\"debian-12-amd64-*\"]\n  }\n\n  filter {\n    name   = \"virtualization-type\"\n    values = [\"hvm\"]\n  }\n\n  owners = [\"679593333241\"]\n}\n```\n- **Função**: Obtém a AMI mais recente do Debian 12.\n- **Detalhes**:\n  - `most_recent`: Seleciona a AMI mais recente.\n  - `filter`: Filtra por nome e tipo de virtualização.\n  - `owners`: Especifica o proprietário da AMI.\n\n### Instância EC2\n```hcl\nresource \"aws_instance\" \"debian_ec2\" {\n  ami             = data.aws_ami.debian12.id\n  instance_type   = \"t2.micro\"\n  subnet_id       = aws_subnet.main_subnet.id\n  key_name        = aws_key_pair.ec2_key_pair.key_name\n  security_groups = [aws_security_group.main_sg.name]\n\n  associate_public_ip_address = true\n\n  root_block_device {\n    volume_size           = 20\n    volume_type           = \"gp2\"\n    delete_on_termination = true\n  }\n\n  user_data = \u003c\u003c-EOF\n              #!/bin/bash\n              apt-get update -y\n              apt-get upgrade -y\n              EOF\n\n  tags = {\n    Name = \"${var.projeto}-${var.candidato}-ec2\"\n  }\n}\n```\n- **Função**: Cria uma instância EC2 com Debian 12.\n- **Detalhes**:\n  - `ami`: Usa a AMI do Debian 12 obtida anteriormente.\n  - `instance_type`: Define o tipo da instância como `t2.micro`.\n  - `subnet_id`: Associa a instância à subnet criada.\n  - `key_name`: Usa o key pair criado.\n  - `security_groups`: Associa o grupo de segurança criado.\n  - `associate_public_ip_address`: Associa um IP público à instância.\n  - `root_block_device`: Configura o volume raiz com 20 GB do tipo `gp2`.\n  - `user_data`: Executa comandos de atualização ao iniciar a instância.\n  - `tags`: Adiciona tags para identificação.\n\n### Outputs\n```hcl\noutput \"private_key\" {\n  description = \"Chave privada para acessar a instância EC2\"\n  value       = tls_private_key.ec2_key.private_key_pem\n  sensitive   = true\n}\n\noutput \"ec2_public_ip\" {\n  description = \"Endereço IP público da instância EC2\"\n  value       = aws_instance.debian_ec2.public_ip\n}\n```\n- **Função**: Define saídas que podem ser usadas após a execução do Terraform.\n- **Detalhes**:\n  - `private_key`: Exibe a chave privada gerada (sensível).\n  - `ec2_public_ip`: Exibe o IP público da instância EC2 criada.\n\n\n\n# Meu Projeto  Terraform com as melhorias e modificações \n\nEste projeto Terraform cria uma infraestrutura básica na AWS, incluindo:\n- Um par de chaves SSH para acesso à instância EC2.\n- Uma instância EC2 com Debian 12.\n- Um grupo de segurança para permitir tráfego SSH e HTTP.\n- Configuração automática do Nginx na instância EC2.\n\nO código foi projetado para usar recursos já existentes na AWS (como VPC e Subnet) para minimizar custos e simplificar a implantação.\n## Pré-requisitos\n\nAntes de executar este código, certifique-se de que você tem o seguinte configurado:\n\n1. **Conta AWS**:\n   - Uma conta na AWS com permissões para criar recursos como EC2, VPC, Security Groups, etc.\n   - Credenciais da AWS configuradas no seu ambiente. Você pode fazer isso usando o AWS CLI:\n     ```bash\n     aws configure\n     ```\n     Insira suas credenciais (`AWS Access Key ID`, `AWS Secret Access Key`, `Default region name`, etc.).\n\n2. **Terraform instalado**:\n   - Instale o Terraform no seu ambiente. No WSL (Ubuntu), siga os passos abaixo documentação (https://www.terraform.io/docs):\n     ```bash\n     sudo apt-get update \u0026\u0026 sudo apt-get install -y gnupg software-properties-common\n     wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg\n     echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/hashicorp.list\n     sudo apt update \u0026\u0026 sudo apt install terraform\n     ```\n   - Verifique a instalação:\n     ```bash\n     terraform --version\n     ```\n\n3. **WSL com Ubuntu**:\n   Este passo só pe necessario se voce estiver usando o sistema windowns.\n   - Certifique-se de que o WSL (Windows Subsystem for Linux) com Ubuntu está instalado e funcionando corretamente.\n   - Ou esteja usando Ubuntu de forma nativa.\\\n\n---\n\n## Estrutura do Projeto\n\nO projeto consiste nos seguintes arquivos:\n\n1. **`main.tf`**:\n   - Contém a definição dos recursos da AWS, como a instância EC2, o grupo de segurança, o par de chaves SSH, etc.\n\n2. **`variables.tf`**:\n   - Define as variáveis usadas no projeto, como o nome do projeto, candidato, ID da VPC, ID da subnet, etc.\n\n3. **`outputs.tf`**:\n   - Define as saídas do Terraform, como o endereço IP público da instância EC2 e a chave privada SSH.\n\n---\n\n## Como Executar o Projeto\n\nSiga os passos abaixo para rodar o código Terraform:\n\n### 1. Clone o repositório (se aplicável)\nSe o código estiver em um repositório Git, clone-o:\n```bash\ngit clone \u003chttps://github.com/aureliodeboa/DevOps_VEXPENSES\u003e\ncd \u003cDevOps_VEXPENSES\u003e\n```\n\n### 2. Inicialize o Terraform\nNo diretório do projeto, execute o comando abaixo para inicializar o Terraform e baixar os plugins necessários:\n```bash\nterraform init\n```\n\n### 3. Revise o Plano de Execução\nAntes de aplicar as mudanças, revise o plano de execução para verificar quais recursos serão criados:\n```bash\nterraform plan\n```\n\n### 4. Aplique as Mudanças\nPara criar os recursos na AWS, execute:\n```bash\nterraform apply\n```\nConfirme a execução digitando `yes` quando solicitado.\n\n### 5. Acesse a Instância EC2\nApós a execução bem-sucedida, o Terraform exibirá as saídas definidas no arquivo `outputs.tf`:\n- **Chave privada SSH**: Salve a chave privada em um arquivo (por exemplo, `chave_privada.pem`) e configure as permissões:\n  ```bash\n  echo \"$(terraform output -raw private_key)\" \u003e chave_privada.pem\n  chmod 400 chave_privada.pem\n  ```\n- **Endereço IP público**: Use o IP público para acessar a instância via SSH:\n  ```bash\n  ssh usuario@IP -i caminho_da_chave\n  ```\n\n### 6. Destrua a Infraestrutura (opcional)\nPara remover todos os recursos criados e evitar custos adicionais, execute:\n```bash\nterraform destroy\n```\nConfirme a execução digitando `yes` quando solicitado.\n\n---\n\n## Variáveis do Projeto\n\nAs variáveis usadas no projeto estão definidas no arquivo `variables.tf`. Você pode personalizá-las conforme necessário:\n\n| Variável      | Descrição                          | Valor Padrão               |\n|---------------|------------------------------------|----------------------------|\n| `projeto`     | Nome do projeto                    | `\"VExpenses\"`              |\n| `candidato`   | Nome do candidato                  | `\"aurelio\"`                |\n| `vpc-id`      | ID da VPC existente                | `\"vpc-08a9953a587f1fb64\"`  |\n| `subnet-id`   | ID da subnet existente             | `\"subnet-06c2403fde1c38993\"` |\n\n---\n\n## Saídas do Projeto\n\nAs saídas definidas no arquivo `outputs.tf` são:\n\n1. **Chave privada SSH**:\n   - Usada para acessar a instância EC2.\n   - **Observação**: Essa saída é marcada como `sensitive`, então o valor não será exibido em texto claro no terminal.\n\n2. **Endereço IP público da instância EC2**:\n   - Use esse IP para acessar a instância via SSH ou para acessar o Nginx (na porta 80).\n\n---\n\n## Pontos de Melhoria\n\n### 1. **Uso de VPC Existente**\n   - **Descrição**: Em vez de criar uma nova VPC do zero, é recomendável utilizar uma VPC já existente, como a VPC padrão que é criada automaticamente ao configurar uma conta na AWS.\n   - **Benefícios**:\n     - **Redução de Custos**: Evita a criação de recursos desnecessários, como subnets, gateways e tabelas de rotas, que já estão presentes na VPC padrão.\n     - **Simplicidade**: Simplifica a infraestrutura, especialmente em ambientes onde a VPC padrão já atende às necessidades do projeto.\n   - **Implementação**: Para isso, basta referenciar a VPC existente no código Terraform, utilizando o ID da VPC padrão ou de outra VPC já criada.\n\n   **Implementação**:\n   ```hcl\n         resource \"aws_security_group\" \"main_sg\" {\n      name        = \"${var.projeto}-${var.candidato}-sg\"\n      description = \"Permitir SSH de qualquer lugar e todo o trafego de saida\"\n      #aqui já estou usando o id da vpc que ja é existente  e esta no arquivo de variables.tf\n      vpc_id      = var.vpc-id\n         ...\n    }\n\n   ```\n\n---\n\n### 2. **Organização da Estrutura do Código**\n   - **Descrição**: Dividir o código Terraform em múltiplos arquivos, seguindo boas práticas de organização, como separar variáveis, outputs e recursos em arquivos distintos.\n   - **Benefícios**:\n     - **Manutenção Facilitada**: Facilita a leitura, manutenção e escalabilidade do código.\n     - **Reutilização de Código**: Permite reutilizar variáveis e outputs em outros projetos ou módulos.\n     - **Clareza**: Melhora a clareza do código, tornando-o mais modular e compreensível.\n   - **Implementação**: Criar arquivos separados, como:\n     - `variables.tf`: Para declarar todas as variáveis.\n     - `outputs.tf`: Para definir os outputs.\n     - `main.tf`: Para os recursos principais.\n\n   **Minha Estrutura**:\n   ```\n   terraform/\n   ├── main.tf\n   ├── variables.tf\n   ├── outputs.tf\n   ```\n\n---\n\n### 3. **Acesso SSH Restrito**\n   - **Descrição**: Restringir o acesso SSH à instância EC2 para endereços IPs específicos, em vez de permitir conexões de qualquer lugar (`0.0.0.0/0`).\n   - **Benefícios**:\n     - **Segurança Aprimorada**: Reduz o risco de ataques externos, limitando o acesso apenas a IPs confiáveis.\n     - **Conformidade**: Atende a melhores práticas de segurança e requisitos de conformidade.\n   - **Implementação**: Modificar as regras de entrada (`ingress`) no grupo de segurança para permitir SSH apenas de IPs específicos.\n\n   **Exemplo de Implementação**:\n   ```hcl\n   ingress {\n     description = \"Allow SSH only from specific IPs\"\n     from_port   = 22\n     to_port     = 22\n     protocol    = \"tcp\"\n     cidr_blocks = var.allowed_ssh_ips # esses ips estão nessa variavel\n   }\n   ```\n\n---\n\n### 4. **Documentação no Código**\n   - **Descrição**: Adicionar comentários no código para explicar o propósito de cada bloco de recursos, variáveis e outputs.\n   - **Benefícios**:\n     - **Facilita a Colaboração**: Auxilia outros desenvolvedores ou membros da equipe a entenderem o código rapidamente.\n     - **Manutenção Futura**: Simplifica a manutenção e atualização do código, especialmente em projetos de longa duração.\n   - **Exemplo de Comentários**:\n     ```hcl\n     # Cria uma VPC para o projeto\n     resource \"aws_vpc\" \"main_vpc\" {\n       cidr_block = \"10.0.0.0/16\"\n       ...\n     }\n\n     # Define o nome do projeto como variável\n     variable \"projeto\" {\n       description = \"Nome do projeto\"\n       type        = string\n       default     = \"VExpenses\"\n     }\n     ```\n\n\nOs pontos de melhorias também estão documentados no codigo com comentarios\n\n---\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faureliodeboa%2Fdevops_vexpenses","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faureliodeboa%2Fdevops_vexpenses","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faureliodeboa%2Fdevops_vexpenses/lists"}