Terraform¶
Gerenciamento de infraestrutura como codigo (IaC) do TepConfina.
Estrutura de Modulos¶
O projeto utiliza 11 modulos Terraform organizados por responsabilidade:
infra/terraform/
modules/
vpc/ # VPC, Subnets, NAT Gateway, Internet Gateway
alb/ # Application Load Balancer, Target Groups
ecs/ # ECS Cluster, Task Definition, Service
ecr/ # Elastic Container Registry
rds/ # RDS PostgreSQL
elasticache/ # ElastiCache Redis
cloudwatch/ # Alarms, Dashboards, Log Groups
monitoring/ # SNS Topics, Subscription
backup/ # AWS Backup Plans
security/ # Security Groups, IAM Roles
networking/ # Route53, ACM Certificates
environments/
dev.tfvars # Variaveis para desenvolvimento
staging.tfvars # Variaveis para staging
prod.tfvars # Variaveis para producao
main.tf # Orquestracao dos modulos
variables.tf # Declaracao de variaveis
outputs.tf # Outputs do Terraform
backend.tf # Configuracao do state remoto
Modulos¶
| Modulo | Recursos Gerenciados |
|---|---|
vpc | VPC, Subnets, NAT Gateway, Internet Gateway, Route Tables |
alb | Load Balancer, Listeners, Target Groups |
ecs | Cluster, Task Definition, Service, Auto-scaling |
ecr | Repositorio de imagens Docker |
rds | Instancia PostgreSQL, Subnet Group, Parameter Group |
elasticache | Cluster Redis, Subnet Group, Parameter Group |
cloudwatch | Log Groups, Alarms, Dashboards |
monitoring | SNS Topics, Email Subscriptions |
backup | Backup Plans, Backup Vault |
security | Security Groups, IAM Roles, IAM Policies |
networking | Route53 Records, ACM Certificates |
State Management¶
O estado do Terraform e armazenado remotamente no S3 com lock via DynamoDB:
terraform {
backend "s3" {
bucket = "tepconfina-terraform-state"
key = "terraform.tfstate"
region = "sa-east-1"
dynamodb_table = "tepconfina-terraform-locks"
encrypt = true
}
}
State remoto obrigatorio
Nunca armazene o state localmente em ambientes compartilhados. O state contem informacoes sensiveis e deve ser centralizado.
Multi-Ambiente¶
Cada ambiente possui seu arquivo .tfvars:
# environments/staging.tfvars
environment = "staging"
ecs_cpu = 512
ecs_memory = 1024
ecs_desired_count = 1
rds_instance_class = "db.t3.micro"
redis_node_type = "cache.t3.micro"
rds_multi_az = false
# environments/prod.tfvars
environment = "production"
ecs_cpu = 1024
ecs_memory = 2048
ecs_desired_count = 2
rds_instance_class = "db.r6g.large"
redis_node_type = "cache.r6g.large"
rds_multi_az = true
Comandos¶
Utilize o script auxiliar para executar comandos Terraform:
| Comando | Descricao |
|---|---|
init | Inicializa o Terraform e configura o backend |
plan | Mostra as alteracoes que serao aplicadas |
apply | Aplica as alteracoes na infraestrutura |
destroy | Remove toda a infraestrutura (use com cautela) |
Exemplos¶
# Inicializar Terraform para staging
./scripts/terraform.sh staging init
# Ver o plano de alteracoes para producao
./scripts/terraform.sh prod plan
# Aplicar alteracoes em staging
./scripts/terraform.sh staging apply
Cuidado com destroy
O comando destroy remove todos os recursos. Nunca execute em producao sem aprovacao da equipe.
Workspace-based Isolation¶
Cada ambiente utiliza um workspace separado do Terraform, garantindo isolamento completo do state:
# Listar workspaces
terraform workspace list
# Selecionar workspace
terraform workspace select staging
Boas Praticas¶
Sempre faca plan antes de apply
Revise cuidadosamente o output do terraform plan antes de aplicar. Verifique especialmente recursos que serao destruidos e recriados.
- Execute
planantes de cadaapply - Utilize variaves para valores que mudam entre ambientes
- Mantenha modulos pequenos e focados
- Documente outputs relevantes para outros modulos
- Faca code review em alteracoes de infraestrutura