Terraform 29: 2: Layout multi-entorno (dev / uat / prod)
easy⏱ 5 mincourseterraform
Un directorio por entorno
Dale a cada entorno su propio directorio raíz. Cada uno tiene un set idéntico de archivos .tf pero una clave de estado distinta en backend.tf y un terraform.tfvars distinto. Correr terraform apply en envs/prod nunca puede tocar por accidente el estado de dev — son archivos de estado completamente separados.
# envs/
# dev/
# main.tf
# backend.tf # key = "orders/dev/terraform.tfstate"
# terraform.tfvars # environment = "dev"
# uat/
# main.tf
# backend.tf # key = "orders/uat/terraform.tfstate"
# terraform.tfvars # environment = "uat"
# prod/
# main.tf
# backend.tf # key = "orders/prod/terraform.tfstate"
# terraform.tfvars # environment = "prod"
Clave de backend distinta por entorno
El backend remoto guarda el estado de cada entorno bajo una key distinta dentro del contenedor de estado. Misma cuenta de almacenamiento, distinta ruta del blob. Esa única línea que difiere es lo que mantiene los estados aislados.
# envs/dev/backend.tf
terraform {
backend "azurerm" {
resource_group_name = "myorg-tfstate-rg"
storage_account_name = "myorgtfstate"
container_name = "tfstate"
key = "orders/dev/terraform.tfstate"
}
}
# envs/prod/backend.tf — only the key changes
terraform {
backend "azurerm" {
resource_group_name = "myorg-tfstate-rg"
storage_account_name = "myorgtfstate"
container_name = "tfstate"
key = "orders/prod/terraform.tfstate"
}
}
Los tfvars por entorno manejan las diferencias
Los archivos .tf son idénticos entre entornos; lo que difiere es el terraform.tfvars — tamaños, cantidades, SKUs y el tag environment. Aplicá con terraform apply -var-file=terraform.tfvars (auto-cargado si se llama terraform.tfvars).
# envs/dev/terraform.tfvars
environment = "dev"
location = "westus2"
vm_count = 1
sku = "Standard_B1s"
# envs/prod/terraform.tfvars
environment = "prod"
location = "westus2"
vm_count = 3
sku = "Standard_D2s_v5"
Construí la clave de estado del backend
Escribí backendKey(service, env) que devuelva "{service}/{env}/terraform.tfstate". Logueá backendKey("orders", "prod") — debe imprimir orders/prod/terraform.tfstate.