基于Data块构建Terraform变量对象时index函数报错求助
Terraform index函数报错修复:子网优先级计算问题
问题场景
尝试通过locals.tf构建对象,提取data.azurerm_subnet.vnet-subnets的值用于Web App部署,需要为每个子网生成数字类型的priority参数,但使用index函数时触发错误:
│ Error: Unsupported attribute │ │ on locals.tf line 7, in locals: │ 7: priority = index(tolist(data.azurerm_subnet.vnet-subnets), subnet.name) + 100 │ │ Can't access attributes on a primitive-typed value (string).
错误原因
- 循环逻辑错误:
data.azurerm_subnet.vnet-subnets是通过for_each生成的映射(map),每个val本身就是单个子网对象,而非列表。原代码中for subnet in val会遍历字符串(子网名称)的字符,导致subnet是单个字符,无法访问.name属性。 - index函数使用错误:
tolist(data.azurerm_subnet.vnet-subnets)会将映射的**键(子网名称字符串)**转为列表,而非子网对象列表,无法通过subnet.name匹配查找。
修复方案
修正locals.tf逻辑
调整循环结构,直接遍历映射的键值对,利用键的位置生成优先级:
locals { webapp_vnet_subnets = [ for key, subnet in data.azurerm_subnet.vnet-subnets : { name = subnet.name subnet_id = subnet.id priority = index(keys(data.azurerm_subnet.vnet-subnets), key) + 100 } ] }
- 改用列表推导式,直接输出Web App所需的规则对象列表
- 通过
keys(data.azurerm_subnet.vnet-subnets)获取子网名称列表,用index获取当前子网在列表中的位置,加100得到起始优先级 - 确保
priority为数字类型,符合Web App部署要求
修正main.tf引用
由于模块的virtual_network_rule需要对象列表,直接引用修正后的local变量:
network_rulesets = { ip_rule = [] virtual_network_rule = local.webapp_vnet_subnets }
关键说明
keys(data.azurerm_subnet.vnet-subnets)返回的列表顺序由Terraform内部排序决定,若需自定义优先级顺序,可手动指定子网名称列表,例如:priority = index(["subnet-a", "subnet-b", "subnet-c"], key) + 100- 若仅需单个子网的规则(如原代码中
var.prod_subnet),可简化local为单个对象:locals { webapp_vnet_subnet = { name = data.azurerm_subnet.vnet-subnets[var.prod_subnet].name subnet_id = data.azurerm_subnet.vnet-subnets[var.prod_subnet].id priority = 100 # 固定优先级或按需求计算 } }
内容的提问来源于stack exchange,提问作者NickP
相关产品推荐
相关产品推荐

