Terraform Tutorial — Multi-Environment Pattern

1 minute read

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.


← Workspaces vs Directories Practice Exercises →