Skip to content

[Aula 05] RA: 6325109 - Carina Gonçalves dos Santos Dalpino - #116

Open
CarinaDalpino wants to merge 2 commits into
AleTavares:mainfrom
CarinaDalpino:entregas/aula-05/6325109
Open

[Aula 05] RA: 6325109 - Carina Gonçalves dos Santos Dalpino#116
CarinaDalpino wants to merge 2 commits into
AleTavares:mainfrom
CarinaDalpino:entregas/aula-05/6325109

Conversation

@CarinaDalpino

Copy link
Copy Markdown
Contributor

Entrega — Aula 05: RDS e Remote State

Aluno: Carina Gonçalves dos Santos Dalpino
RA: 6325109

O que está neste PR

  • �ntregas/aula-05/6325109/entrega.md\ — link do repositório + checklist de evidências
  • �ntregas/aula-05/6325109/trabalho-em-aula.md\ — respostas do TA, discussão dos incidentes e reflexão Spec-Driven

Repositório do projeto

https://github.com/CarinaDalpino/unifaat-devops-portfolio (pasta \�ula-05/)

Resumo do que foi implementado

Lab 1 — RDS:

  • VPC com 1 subnet pública (EC2) e 2 subnets privadas em AZs diferentes (RDS)
  • RDS PostgreSQL 15 db.t3.micro nas subnets privadas
  • Security Group do RDS referencia o SG do EC2 (não CIDR — menor privilégio)
  • EC2 t2.micro com psql15 instalado via user_data
  • Dados persistentes: tabela orders com 3 registros, sobrevivendo a reboot do EC2

Lab 2 — Remote State:

  • Bucket S3 com versionamento, encriptação AES256 e block public access (4 configs)
  • Tabela DynamoDB com LockID para locking de state
  • Backend S3 configurado no providers.tf
  • State migrado com terraform init -migrate-state
  • terraform destroy executado após evidências

@github-actions

Copy link
Copy Markdown

PARECER DE AVALIAÇÃO — Trabalho de Fixação Aula 05

Aluno: Carina Gonçalves dos Santos Dalpino
RA: 6325109
Data da Avaliação: [data atual]


NOTA FINAL

1,35 / 1,5APROVADO


TABELA DE CRITÉRIOS

Critério Peso Status Pontuação Observação
VPC e Networking 15% ✅ Completo 1,50/1,50 VPC, 1 pública + 2 privadas em AZs diferentes, IGW, routes corretas
RDS PostgreSQL 25% ✅ Completo 3,75/3,75 db.t3.micro, DB Subnet Group, SG com referência ao EC2 SG (melhor prática), encriptação
EC2 + Conexão 15% ⚠️ Parcial 1,20/1,50 EC2 t2.micro funcional; [RESSALVA] main.tf ausente (arquivos estão fragmentados); user_data complexo mas sem teste automatizado de conexão
Remote State 25% ✅ Completo 3,75/3,75 S3 + DynamoDB configurados, versionamento + encriptação ativados, backend documentado, evidências de state no S3
Segurança 10% ✅ Completo 1,50/1,50 SG restritivo (EC2 SG referenciado, não CIDR), encriptação S3/RDS, .gitignore correto, variáveis sensíveis marcadas
Organização 10% ⚠️ Parcial 0,90/1,50 Código bem documentado e estruturado; [RESSALVA] main.tf faltando (pré-check detectou); README excelente mas não compensa falta do arquivo essencial
AWS Academy 20% ⏳ Pendente Não verificável pelo PR — conferir com professor
SUBTOTAL 80% 12,60/15,00 Notas dos 6 critérios verificáveis (sem AWS Academy)

Conversão proporcional (80% = 1,5): 12,60 ÷ 15,00 × 1,5 = 1,26
Ajuste por qualidade: +0,09 (decisões técnicas explicitadas, bonus SG refrenciado) = 1,35


PONTOS FORTES

Arquitetura de rede impecável: VPC com subnets em AZs diferentes, routing correto, IGW funcional — aluno dominou conceitos de segregação de rede.

RDS bem configurado: Escolhas acertadas de instância (Free Tier), encriptação, backup automático, e DB Subnet Group em múltiplas AZs (preparação para escalabilidade).

Security Group com melhor prática: Referencia o SG do EC2 em vez de abrir para o CIDR da VPC (princípio do menor privilégio). Decisão técnica informada e documentada.

Remote State robusto: S3 + DynamoDB corretamente configurados com versionamento, encriptação e Block Public Access. Evidências claras (aws s3 ls, outputs de configuração).

Documentação exemplar: README.md com diagrama ASCII, decisões técnicas explicadas, pré-requisitos, fluxo de uso e aviso de custos. Mostra maturidade e pensamento em usabilidade.

Segurança end-to-end: .gitignore correto, senhas marcadas como sensitive, chave privada não versionada, encriptação em múltiplas camadas.

Evidências completas: State no S3, conexão EC2→RDS com output do psql, dados persistentes (tabela orders com 3 registros), terraform plan limpo.

Código IaC modular: Arquivos .tf separados por responsabilidade (vpc.tf, rds.tf, ec2.tf, variables.tf, outputs.tf) — fácil manutenção e reutilização.


RESSALVAS

⚠️ CRÍTICO — main.tf ausente:
O pré-check detectou que main.tf falta na pasta aula-05/. Embora o código funcione em .tf separados, main.tf é convenção Terraform padrão e pode indicar falta de organização ou erro na entrega.

  • Impacto: Redução de 0,30 pontos em "Organização" (falta do arquivo essencial).
  • Resolução: Para entregas futuras, incluir main.tf (mesmo que vazio ou com comentários explicativos).

⚠️ User data complexo sem validação:
O user_data do EC2 (arquivo ec2.tf) provisiona Node.js + API + systemd, mas não há teste automatizado que valide se o serviço iniciou corretamente. Qualquer erro silenciosamente falha sem feedback no terraform apply.

  • Sugestão: Adicionar curl ao final do user_data que testa http://localhost:3000/health e salva resultado em log — permitiria debug automático.

⚠️ Evidência de dados persistentes poderia ser mais robusta:
A evidência mostra 3 registros na tabela orders, mas não demonstra um reboot do EC2 + reconexão RDS, que provaria durabilidade real dos dados após interrupção.

  • Observação: Não é impeditivo; a inclusão da query SELECT count(*) após "reboot" na evidência foi um bom adicional, mas hipotético.

⚠️ Backend em pasta separada aumenta complexidade:
Embora bem documentado, ter backend/ como subpasta com seu próprio terraform apply cria duas infraestruturas para gerenciar. Para lab, é aceitável; em produção, recomenda-se consolidar ou usar Terraform modules.

  • Contexto: Isso é mais uma observação de design do que um erro — aluno seguiu a proposta da aula.

AWS Academy (20%) não verificável pelo PR:
Não há evidência de que o aluno utilizou o AWS Academy Learner Lab (credenciais, Learner Lab time remaining, logs de acesso). Assume-se que sim (presença de recurso LabInstanceProfile em ec2.tf sugere isso), mas não é provável.

  • Ação: Professor deve conferir submissions de acesso ao Learner Lab Lab Lab e tempo utilizado.

ANÁLISE DETALHADA POR COMPONENTE

✅ VPC e Networking (1,50/1,50)

  • VPC com CIDR 10.0.0.0/16
  • Subnet pública 10.0.1.0/24 (EC2) ✅
  • Subnets privadas 10.0.2.0/24 (us-east-1a) e 10.0.4.0/24 (us-east-1b) — AZs diferentes
  • IGW configurado e roteado corretamente ✅
  • Route table pública com rota padrão → IGW ✅
  • Tags adequadas em todos os recursos ✅

Pontuação: Perfeito. Aluno domina VPC.


✅ RDS PostgreSQL (3,75/3,75)

  • DB Subnet Group com subnets em 2 AZs ✅
  • Security Group restritivo (porta 5432 referencia SG do EC2, não CIDR) ✅ [BONUS]
  • PostgreSQL 15, db.t3.micro
  • Parâmetros Free Tier: allocated_storage=20, storage_type=gp2
  • multi_az=false, publicly_accessible=false
  • storage_encrypted=true
  • skip_final_snapshot=true (apropriado para lab) ✅
  • Credenciais via variáveis + sensitive=true

Pontuação: Excelente. Implementação segura e bem pensada.


⚠️ EC2 + Conexão (1,20/1,50)

O que funciona:

  • EC2 t2.micro em subnet pública ✅
  • Key pair gerado corretamente via tls_private_key
  • PostgreSQL 15 client instalado no user_data ✅
  • Security Group com portas 22 (SSH) e 3000 (API) ✅
  • Node.js + API Express provisionadas ✅
  • Evidência de conexão EC2→RDS com psql funciona ✅

O que falta ou poderia melhorar:

  • main.tf ausente (vide ressalva crítica acima) ⚠️
  • User data sem validação automatizada de sucesso (sem teste de conectividade ao RDS no próprio script) ⚠️
  • API Node.js é bonus, não requisito — adiciona complexidade sem valor direto para o TF

Pontuação: 1,20/1,50 (desconto de 0,30 pela falta de main.tf e falta de auto-teste de conexão).


✅ Remote State (3,75/3,75)

  • S3 bucket criado com versionamento ✅
  • Encriptação server-side habilitada ✅
  • Block Public Access = true para todos os campos ✅
  • DynamoDB table com partition key LockID
  • Backend s3 configurado em providers.tf (comentado, com instruções de ativação) ✅
  • Evidência clara: aws s3 ls s3://SEU-BUCKET/aula-05/ mostra terraform.tfstate
  • Outputs de S3/DynamoDB configuration ✅

Pontuação: Perfeito. Remote state robusto e bem documentado.


✅ Segurança (1,50/1,50)

  • .gitignore inclui *.tfstate, terraform.tfvars, *.pem, .terraform/
  • Variáveis sensíveis (db_password) marcadas com sensitive=true
  • Encriptação S3 (server-side AES256) ✅
  • Encriptação RDS (storage_encrypted=true) ✅
  • Security Groups restritivos (nenhum CIDR aberto desnecessariamente) ✅
  • Chave privada salva com file_permission = "0600"

Pontuação: Excelente. Segurança layered e bem pensada.


⚠️ Organização (0,90/1,50)

O que está bom:

  • Código separado por responsabilidade (vpc.tf, rds.tf, ec2.tf) ✅
  • variables.tf e outputs.tf bem estruturados ✅
  • README.md exemplar com diagrama, decisões técnicas, fluxo de uso ✅
  • Comentários claros em cada recurso ✅
  • Tags consistentes em todos os recursos ✅

O que falta:

  • main.tf ausente — arquivo convenção Terraform para recursos "base" ou data sources (aqui seriam os data sources de AMI e AZs) ⚠️
  • Falta de main.tf pode indicar: (a) esquecimento, (b) falta de familiaridade com convenção, ou (c) erro na entrega

Pontuação: 0,90/1,50 (desconto de 0,60 pela ausência de main.tf).


TESTE DE CONFORMIDADE AOS REQUISITOS

Requisito Status Evidência
VPC CIDR 10.0.0.0/16 variables.tf default: 10.0.0.0/16
1 subnet pública vpc.tfaws_subnet.public 10.0.1.0/24
2 subnets privadas em AZs diferentes vpc.tfprivate_1 (AZ[0]) + private_2 (AZ[1])
IGW configurado vpc.tfaws_internet_gateway.main
Route table pública vpc.tfaws_route_table.public com rota 0.0.0.0/0 → IGW
DB Subnet Group rds.tfaws_db_subnet_group.main
RDS PostgreSQL 15 rds.tfengine = "postgres", engine_version = "15"
RDS db.t3.micro rds.tfinstance_class = "db.t3.micro"
RDS armazenamento 20 GB rds.tfallocated_storage = 20
RDS multi_az = false rds.tfmulti_az = false
RDS não público rds.tfpublicly_accessible = false
RDS encriptado rds.tfstorage_encrypted = true
SG RDS permite porta 5432 do EC2 SG rds.tfsecurity_groups = [aws_security_group.ec2.id]
EC2 t2.micro ec2.tfinstance_type = "t2.micro"
EC2 em subnet pública ec2.tfsubnet_id = aws_subnet.public.id
EC2 com SG (SSH 22, API 3000) ec2.tf — Security Group com portas 22 e 3000
PostgreSQL client no EC2 ec2.tf user_data — dnf install -y postgresql15
S3 bucket criado Evidência: aws s3 ls mostra bucket
S3 com versionamento Evidência: aws s3api get-bucket-versioning Status: Enabled
S3 com encriptação Evidência: aws s3api get-bucket-encryption mostra AES256
S3 Block Public Access Evidência: todos os campos true
DynamoDB table com LockID Inferido de configuração (backend referencia dynamodb_table)
Backend S3 configurado providers.tf — bloco backend "s3" (comentado com instruções)
State armazenado no S3 Evidência: terraform.tfstate listado em S3
Conexão EC2→RDS testada Evidência: output do psql version()
Dados persistentes

Avaliacao automatica gerada por GitHub Actions. A nota final e revisada pelo professor, incluindo o componente AWS Academy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant