Terraform Advanced — Hybrid Approach

less than 1 minute read

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.

← Workspace Patterns Real Project Structure →

Updated: