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