Multi-Environment

Deploy EC2 instances with environment-specific configurations using variable maps.

locals {
  environment = "production" # or "staging", "development"

  instance_configs = {
    production = {
      instance_type = "m6i.xlarge"
      volume_size   = 100
      monitoring    = true
      multi_az      = true
    }
    staging = {
      instance_type = "t3.large"
      volume_size   = 50
      monitoring    = true
      multi_az      = false
    }
    development = {
      instance_type = "t3.medium"
      volume_size   = 30
      monitoring    = false
      multi_az      = false
    }
  }

  config = local.instance_configs[local.environment]
}

module "app_server" {
  source  = "registry.patterneddesigns.ca/patterneddesigns/ec2-instance/aws"
  version = "1.5.0"

  instance_name = "app-${local.environment}"
  instance_type = local.config.instance_type
  ami_id        = data.aws_ami.amazon_linux.id
  subnet_id     = module.vpc.private_subnets[0]

  monitoring = local.config.monitoring

  root_block_device = {
    volume_size = local.config.volume_size
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Environment = local.environment
    ManagedBy   = "terraform"
  }
}

Using Terraform Workspaces

locals {
  environment = terraform.workspace

  instance_types = {
    default     = "t3.micro"
    development = "t3.medium"
    staging     = "t3.large"
    production  = "m6i.xlarge"
  }
}

module "workspace_server" {
  source  = "registry.patterneddesigns.ca/patterneddesigns/ec2-instance/aws"
  version = "1.5.0"

  instance_name = "app-${local.environment}"
  instance_type = lookup(local.instance_types, local.environment, local.instance_types.default)
  ami_id        = data.aws_ami.amazon_linux.id
  subnet_id     = module.vpc.private_subnets[0]

  tags = {
    Environment = local.environment
    Workspace   = terraform.workspace
  }
}

Multiple Instances Per Environment

variable "environment" {
  type    = string
  default = "production"
}

variable "instance_count" {
  type = map(number)
  default = {
    production  = 3
    staging     = 2
    development = 1
  }
}

module "app_servers" {
  source   = "registry.patterneddesigns.ca/patterneddesigns/ec2-instance/aws"
  version  = "1.5.0"
  for_each = toset([for i in range(var.instance_count[var.environment]) : tostring(i)])

  instance_name = "app-${var.environment}-${each.key}"
  instance_type = local.config.instance_type
  ami_id        = data.aws_ami.amazon_linux.id
  subnet_id     = module.vpc.private_subnets[tonumber(each.key) % length(module.vpc.private_subnets)]

  tags = {
    Environment = var.environment
    Index       = each.key
  }
}

Notes

  • Use consistent naming conventions across environments
  • Consider using separate AWS accounts for production isolation
  • Store environment-specific values in tfvars files
  • Use remote state with workspace-aware backends