Terraform Tutorial — Multi-Environment Pattern
Here’s a complete pattern for managing dev, staging, and prod environments using Terraform workspaces.
Project Structure
project/
├── main.tf
├── variables.tf
├── outputs.tf
├── versions.tf
├── environments/
│ ├── dev.tfvars
│ ├── staging.tfvars
│ └── prod.tfvars
└── modules/
└── app/
Configuration with Workspace-Aware Locals
# main.tf
locals {
env_config = {
dev = {
instance_type = "t3.micro"
instance_count = 1
db_class = "db.t3.micro"
multi_az = false
}
staging = {
instance_type = "t3.small"
instance_count = 2
db_class = "db.t3.small"
multi_az = false
}
prod = {
instance_type = "t3.large"
instance_count = 5
db_class = "db.r6g.large"
multi_az = true
}
}
config = local.env_config[terraform.workspace]
}
module "app" {
source = "./modules/app"
environment = terraform.workspace
instance_type = local.config.instance_type
instance_count = local.config.instance_count
db_class = local.config.db_class
multi_az = local.config.multi_az
}
Deployment Workflow
# Deploy to dev
$ terraform workspace select dev
$ terraform apply -var-file="environments/dev.tfvars"
# Deploy to staging
$ terraform workspace select staging
$ terraform apply -var-file="environments/staging.tfvars"
# Deploy to production
$ terraform workspace select prod
$ terraform apply -var-file="environments/prod.tfvars"
CI/CD Pipeline
jobs:
deploy:
strategy:
matrix:
environment: [dev, staging, prod]
steps:
- name: Select workspace
run: terraform workspace select ${{ matrix.environment }}
- name: Apply
run: terraform apply -auto-approve -var-file="environments/${{ matrix.environment }}.tfvars"
What’s Next?
Practice workspaces with the exercises.