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 textualnumber: valor numéricobool:trueoufalselist: 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.tfvarsAlgumas sugestões:
- Use o arquivo
variables.tfapenas para declarar variáveis, sem valores. - Deixe os valores sensíveis **fora do repositório**, ou seja, coloque o
.tfvarsno.gitignore. - Separe ambientes (dev, prod) com arquivos diferentes ou usando workspaces (falaremos sobre isso ainda)
4. Outras boas práticas importantes
- Sempre use
terraform planantes do apply - Versione o Terraform (
.terraform-versionou norequired_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!)