【问题标题】:Conditionals in for_each loop around elastic IPsfor_each 中的条件围绕弹性 IP 循环
【发布时间】:2020-12-19 19:58:58
【问题描述】:

我有以下代码,我希望有一个条件,仅当实例是公共子网的一部分时才会创建弹性 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

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您可以使用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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2013-01-13
      • 2020-11-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多