Se você chegou agora e quer entender o que foi feito até aqui, recomendo dar um passo para trás e ver os posts anteriores:

Terraform: Dando o próximo passo – Criando uma infraestrutura do zero na GCP

Esse post (e o próximo) provavelmente será um pouco mais teórico do que eu gosto, mas vamos dar um passo importante: organizar o projeto com boas práticas. Vamos entender melhor o uso de variáveis, outputs – que criamos previamente. E já aproveitamos para modularizar um pouco mais o projeto.

O que vamos ver hoje:

  • Como declarar e usar variáveis corretamente
  • Como usar outputs para facilitar a integração e debug
  • Tipos de variáveis no Terraform
  • Como estruturar seu projeto de forma limpa e escalável
  • Primeiras boas práticas para trabalhar com Terraform de forma profissional

1. Tipos de variáveis

No Terraform, podemos usar vários tipos de variáveis, como:

  • string: valor textual
  • number: valor numérico
  • bool: true ou false
  • list: lista de valores, ex: ["dev", "staging", "prod"]
  • map: estrutura chave-valor, ex: { dev = "10.0.0.0/16", prod = "10.1.0.0/16" }
  • object: estrutura mais complexa

Exemplo de lista:

variable "regions" {<br>type = list(string)<br>default = ["us-central1", "us-east1"]<br>}

2. Outputs

Os outputs são formas de expormos informações úteis depois do apply, como IPs, nomes de recursos, ou e-mails de service accounts que foram criados no processo.

Vamos para um exemplo prático:

Exemplo de outputs.tf em um módulo:

output "instance_ip" {
  value = google_compute_instance.vm.network_interface[0].access_config[0].nat_ip
}

Como acessamos esse output em outro módulo ou ambiente:

Se você usar terraform_remote_state, pode fazer isso, por exemplo:

data "terraform_remote_state" "dev" {
  backend = "gcs"
  config = {
    bucket = "meu-terraform-states"
    prefix = "dev/infrastructure"
  }
}

resource "google_dns_record_set" "registro" {
  name = "app.dev.example.com."
  type = "A"
  ttl = 300
  rrdatas = [data.terraform_remote_state.dev.outputs.instance_ip]
}

Isso te permite “encadear” infraestruturas: o output do ambiente dev pode alimentar prod, ou o de um módulo pode alimentar outro.

Isso é útil para integrarmos com outros módulos, ferramentas CI/CD ou só para saber o que foi criado (como fizemos no post anterior)

3. Boas práticas de estrutura

Estrutura mínima e limpa:

Terraform/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars

Algumas sugestões:

  • Use o arquivo variables.tf apenas para declarar variáveis, sem valores.
  • Deixe os valores sensíveis **fora do repositório**, ou seja, coloque o .tfvars no .gitignore.
  • Separe ambientes (dev, prod) com arquivos diferentes ou usando workspaces (falaremos sobre isso ainda)

4. Outras boas práticas importantes

  • Sempre use terraform plan antes do apply
  • Versione o Terraform (.terraform-version ou no required_version – mais em [Gerenciando versões do Terraform](https://developer.hashicorp.com/terraform/tutorials/configuration-language/versions))
  • Use backends remotos para o state (falaremos disso no próximo post!)
  • Comente e documente seu código
  • Comece a pensar em **módulos** para componentes reutilizáveis (falaremos disso também em breve!)