Terraform Advanced — Hybrid Approach
Use directories for major environments and workspaces for variations within them.
When Hybrid Makes Sense
environments/
├── prod/ ← Directory (isolated state, different resources)
│ └── main.tf ← Uses workspaces for: prod-us-east-1, prod-eu-west-1
├── staging/
│ └── main.tf
└── dev/
└── main.tf ← Uses workspaces for: dev-alice, dev-bob (personal envs)
Example: Multi-Region with Workspaces
# environments/prod/main.tf
locals {
region_config = {
"prod-us-east-1" = { region = "us-east-1", azs = ["us-east-1a", "us-east-1b"] }
"prod-eu-west-1" = { region = "eu-west-1", azs = ["eu-west-1a", "eu-west-1b"] }
}
config = local.region_config[terraform.workspace]
}
provider "aws" {
region = local.config.region
}
$ cd environments/prod
$ terraform workspace select prod-us-east-1
$ terraform apply
$ terraform workspace select prod-eu-west-1
$ terraform apply
Terragrunt Alternative
Most teams eventually replace directories + workspaces with Terragrunt:
Terragrunt gives you:
✅ Directory per environment (explicit)
✅ No code duplication (DRY with includes)
✅ Automatic backend config per directory
✅ Cross-stack dependencies
What’s Next?
See a real production project structure.