Terraform 29: 2: Multi-environment layout (dev / uat / prod)
easy⏱ 5 mincourseterraform
A directory per environment
Give each environment its own root directory. Each has an identical set of .tf files but a different backend.tf state key and a different terraform.tfvars. Running terraform apply in envs/prod can never accidentally touch dev state — they are separate state files entirely.
# 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"
Distinct backend key per environment
The remote backend stores each environment's state under a different key inside the state container. Same storage account, different blob path. That single differing line is what keeps the states isolated.
# 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"
}
}
Per-environment tfvars drive the differences
The .tf files are identical across environments; the terraform.tfvars file is what differs — sizes, counts, SKUs, and the environment tag. Apply with terraform apply -var-file=terraform.tfvars (auto-loaded if named 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"
Build the backend state key
Write backendKey(service, env) returning "{service}/{env}/terraform.tfstate". Log backendKey("orders", "prod") — it must print orders/prod/terraform.tfstate.