【问题标题】:Terraform - if within for_each. Can I filter for_each?Terraform - 如果在 for_each 内。我可以过滤 for_each 吗?
【发布时间】:2021-06-16 11:08:16
【问题描述】:

通过以下内容,我可以循环遍历资源块,轻松将路由表关联添加到我的“所有”子网。但是,我只需要为我的公共子网创建关联。

我怎样才能使这个“if”语句起作用?或者任何其他过滤each.value.class == "pub"的方式。

resource "aws_route_table_association" "rtb-pub" {
  for_each =  local.subnets_map 
  if each.value.class == "pub"    ## <---- how?

  route_table_id = aws_route_table.rtb-pub.id
  subnet_id      = aws_subnet.map["${each.value.subnet}"].id
}

提前致谢!

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    这完全取决于您的local.subnets_map 的结构。但for_each 应该类似于以下内容:

    resource "aws_route_table_association" "rtb-pub" {
    
      for_each =  {for key, val in local.subnets_map: 
                   key => val if val.class == "pub"}
    
      route_table_id = aws_route_table.rtb-pub.id
      subnet_id      = aws_subnet.map["${each.value.subnet}"].id
    }
    

    【讨论】:

      【解决方案2】:

      for 循环过滤的一个弱点是 AFAIK 会卡在一个匹配值上。

      如果您需要过滤地图或列表中的多个值,请尝试 matchkeys() 函数:https://www.terraform.io/docs/language/functions/matchkeys.html

      使用地图时,您需要使用 keys() 和 values() 函数来提供列表参数:

      local {
      users = { user1 = "value1", user2 = "value2", user3 = "value3", user4 = "value4" }
      }
      
      output user_subset {
        value = matchkeys(values(local.users), keys(local.users), ["user1", "user3"])
      }
      

      生成的输出可用于资源块中的 for_each 循环。在本例中,我将使用它将用户子集添加到组中。

      【讨论】:

      • 请问如何在 for_each 中传递 user_subset?
      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2020-11-01
      • 2021-08-02
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2021-12-31
      相关资源
      最近更新 更多