通过以下操作,我可以循环遍历资源块,将路由表关联添加到"所有";我的子网。但是,我只需要为我的公共子网创建关联。
我该怎么做;如果";报表工作?或者以任何其他方式对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
}
提前感谢!
这取决于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
}
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循环中使用。在本例中,我将使用它将用户的子集添加到组中。