for_each循环中围绕弹性IP的条件

时间:2020-08-31 17:09:24

标签: terraform

我有以下代码,并且我希望有一个条件,该条件仅在实例是公共子网的一部分(或根据需要基于布尔值)的情况下才创建弹性IP。这是我目前可以使用的代码,但是我希望它不要为专用子网上的资源创建弹性IP:

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
}

听起来,count是执行类似操作的最佳方法,但是我不能这样做,因为我已经在使用for_each来实现资源创建。我试图使用嵌套的for循环来执行此操作,但是我无法完全弄清楚如何正确地使用语法,或者这是否是执行此操作的最佳方法。作为参考,我在其中找到的最佳资源是关于for_each条件句:https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9

1 个答案:

答案 0 :(得分:2)

您可以使用for循环来创建过滤后的地图,例如:

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

它将过滤local.instances_beta并保留subnetid等于var.public-a的项目。您可以根据需要调整条件。

More details in terraform documentation