No primeiro post, eu mostrei uma visão geral de como coloquei meu site no ar usando AWS, HTTPS e deploy automatizado. Agora vamos entrar nos detalhes: como organizei tudo com Terraform, aplicando boas práticas de estrutura, reuso e controle de estado.
📁 Estrutura do projeto
Eu dividi o código em dois repositórios:
diego2.0-infra
: infraestrutura em Terraformdiego2.0-site
: código do site (Hugo)
No repositório de infraestrutura, adotei uma estrutura de módulos reutilizáveis:
diego2.0-infra/
├── main.tf
├── variables.tf
├── terraform.tfvars
├── modules/
│ ├── s3/
│ ├── route53/
│ ├── acm/
│ ├── cloudfront/
│ └── dns_records/
Cada pasta em modules/
representa um serviço da AWS, com código isolado e reutilizável.
🚧 Backend remoto com S3 + DynamoDB
Para manter o state remoto e evitar conflitos em time (ou entre ambientes), configurei o backend com:
Bucket S3 para armazenar o
terraform.tfstate
Tabela DynamoDB para controle de locking
Exemplo do bloco:
terraform {
backend "s3" {
bucket = "diego2.0-tfstate"
key = "global/terraform.tfstate"
region = "sa-east-1"
dynamodb_table = "diego2.0-terraform-locks"
encrypt = true
}
}
Esse trecho deve ser incluído no main.tf
após criar o bucket e a tabela via Terraform.
🏋️ Boas práticas aplicadas
Modularização: cada recurso da AWS tem seu próprio módulo
Separar variáveis e valores (
variables.tf
+terraform.tfvars
)Uso de outputs para conectar módulos
Nomenclatura consistente entre os recursos e arquivos
State remoto e versionado, garantindo segurança e rastreabilidade
🚀 Próximo passo
Com a base do Terraform pronta, seguimos para a próxima etapa: Criar o bucket S3 para hospedar o site estático e preparar o deploy.
Se você nunca criou um site com S3, vai ver como é simples e poderoso. Até lá!