You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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).

错误原因

  1. 循环逻辑错误:data.azurerm_subnet.vnet-subnets是通过for_each生成的映射(map),每个val本身就是单个子网对象,而非列表。原代码中for subnet in val会遍历字符串(子网名称)的字符,导致subnet是单个字符,无法访问.name属性。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:55:59