Terraform delivers consistent build and save a lot of time from clicking and scrolling. But when the resources, in this case ec2 resources are slightly different, it may be necessary to create a tf config for every instance. That defeats the purpose of automation.
By storing the differences in a list and use the lookup function to extract the values, I’m able to write the following tf config with little redundant code.
variable "FixInst" { default = [ { inst_name = "Fix-01-A" subnet = "subnet-123" keypair = "uat" }, { inst_name = "Fix-01-B" subnet = "subnet-234" keypair = "uat" }, { inst_name = "Fix-01-C" subnet = "subnet-345" keypair = "Prod" }, { inst_name = "Fix-01-D" subnet = "subnet-456" keypair = "Prod" } ] } resource "aws_instance" "ec2Fix" { count = "${length(var.FixInst)}" ami = "ami-987" tags = "${merge(var.globalTags, map("Name",lookup(var.FixInst[count.index], "inst_name")))}" instance_type = "t2.large" root_block_device { volume_size = "25" volume_type = "gp2" } ebs_block_device { device_name = "/dev/xvdo" volume_type = "gp2" volume_size = 100 encrypted = true } subnet_id = "${lookup(var.FixInst[count.index],"subnet")}" key_name = "${lookup(var.FixInst[count.index],"keypair")}" vpc_security_group_ids = ["sg-123","sg-234","sg-345"] }