Workspaces: Managing Multiple Environments

Learn how to use Terraform workspaces to separate dev, staging & prod, automate state, and scale multi-env infrastructure with less risk.

Workspaces are frequently misunderstood in terms of their appropriate use cases.

The Problem

# Overreliance on workspaces for environment separation
terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "terraform.tfstate"
    region = "us-west-2"
  }
}

# Attempting to use workspace for environment-specific config
resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = terraform.workspace == "prod" ? "m5.large" : "t2.micro"
  
  tags = {
    Environment = terraform.workspace
  }
}

The Solution

# Use directory structure for complete environment separation
# ./environments/prod/main.tf
terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "environments/prod/terraform.tfstate"
    region = "us-west-2"
  }
}

module "application" {
  source = "../../modules/application"
  
  environment   = "prod"
  instance_type = "m5.large"
}

# ./environments/dev/main.tf
terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "environments/dev/terraform.tfstate"
    region = "us-west-2"
  }
}

module "application" {
  source = "../../modules/application"
  
  environment   = "dev"
  instance_type = "t2.micro"
}

Workspaces should be used for temporary or experimental changes, not for environment separation. Scalr takes environment management to the next level with true environment isolation, fine-grained access controls, and environment-specific variables.