0
votes

I have the following code and I would like to have a conditional that will only create an elastic IP if the instance is part of a public subnet (or based off of a boolean value if needed). This is the code that I currently have that works, but I want it to not create elastic IPs for resources on the private subnets:

locals {
  instances_beta = {
    my-ec2 = {
      name           = "myec2",
      ami            = "ami-029e27fb2fc8ce9d8",
      instancetype   = "t3.xlarge"
      environment    = "Beta",
      securitygroups = [var.mysg],
      subnetid       = var.public-a,
      elasticip      = true
    }
  }
}

resource "aws_instance" "beta-instance" {
  for_each               = local.instances_beta
  ami                    = each.value.ami
  instance_type          = each.value.instancetype
  subnet_id              = each.value.subnetid
  key_name               = "mykey"
  vpc_security_group_ids = each.value.securitygroups

  tags = {
    Name        = each.value.name
    Environment = each.value.environment
  }
}

resource "aws_eip" "beta-eip" {
  for_each = local.instances_beta
  instance = aws_instance.beta-instance[each.key].id
  vpc      = true
}

It sounds like count is the best way to do something like that, but I cannot do that as I am already using a for_each to achieve the resource creation. I was trying to do this with a nested for loop, but I cannot quite figure out how to get the syntax correct or if this is the best way to do it. For reference , the best resource I found on it was here around for_each conditionals: https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9

1

1 Answers

2
votes

You can use for loop to create filtered map, for example:

for_each = { 
  for key, value in local.instances_beta: key => value if value.subnetid == var.public-a 
}

It will filter local.instances_beta and leave items where subnetid equals var.public-a. You can adjust condition according to your needs.

More details in terraform documentation.