如何从指定Terraform输出结构中筛选ip_address子集?
解决方案:提取Terraform多区域公网IP的ip_address字段
首先得明确你的公网IP数据源的结构,常见的出错原因是没搞清楚数据源是映射(map)还是列表(list),下面分两种核心场景给出解决方法:
场景1:用for_each创建的多区域公网IP数据源
如果你的data "azurerm_public_ip" "public_ip"是通过for_each参数定义的多区域实例,Terraform会返回一个映射(key是区域或自定义标识,value是对应区域的公网IP实例)。这种情况下直接用[*]遍历会报错,得先用values()函数把映射转成列表,再提取字段:
output "public_ip_addresses" { value = values(data.azurerm_public_ip.public_ip)[*].ip_address }
场景2:单个数据源匹配多个公网IP实例
如果你的数据源是通过过滤条件(比如filter)匹配到了多个公网IP,返回的结构里通常会有一个public_ip列表字段(注意和你的数据源名称区分开),正确的提取方式是:
output "public_ip_addresses" { value = data.azurerm_public_ip.public_ip.public_ip[*].ip_address }
快速排查方法
如果还是不确定结构,直接在终端执行terraform console,输入data.azurerm_public_ip.public_ip查看完整的数据源结构。比如输出是类似{ "eastus": {...}, "westus": {...} }的映射,就用场景1的方法;如果是{ "public_ip": [ {...}, {...} ] }的嵌套结构,就用场景2的方法。
内容的提问来源于stack exchange,提问作者aronchick
相关产品推荐
相关产品推荐

