使用Terraform for循环遍历CSV文件及Invalid reference报错解决
报错原因
你收到的报错是因为代码中没有提前声明data.azurerm_resources.spokes数据源,Terraform无法找到对应的资源实例,因此抛出无效引用错误。
解决步骤
1. 声明缺失的数据源
首先补充azurerm_resources数据源定义,筛选你需要的VNet资源,按需补充筛选条件保证返回的资源是你需要的3个VNet:
data "azurerm_resources" "spokes" { type = "Microsoft.Network/virtualNetworks" # 可选补充筛选条件,比如指定资源组、标签等,缩小返回范围 # resource_group_name = "你的资源组名称" }
2. 实现CSV region列值替换
通过映射表匹配CSV中原有region值和datalist返回的新值,遍历替换即可:
locals { # 读取CSV文件 vnetlist = csvdecode(file("./title.csv")) # 获取现有VNet名称列表 datalist = [for vnets in data.azurerm_resources.spokes.resources : vnets.name] # 构建新旧region映射关系,这里假设CSV中region顺序为us/er/ind,刚好对应datalist返回的regA/regB/regC region_map = zipmap(["us", "er", "ind"], local.datalist) # 如果你不能保证返回顺序固定,也可以手动写死映射表更稳妥: # region_map = { # us = "regA" # er = "regB" # ind = "regC" # } # 遍历替换region列的值 finopslist = [ for row in local.vnetlist : merge(row, { region = lookup(local.region_map, row.region, row.region) }) ] }
3. 验证结果
可以添加输出块查看替换后的结果:
output "replaced_finops_list" { value = local.finopslist }
运行terraform plan即可查看替换后的输出,确认符合预期后再执行后续操作。
内容的提问来源于stack exchange,提问作者kanmani1303
相关产品推荐
相关产品推荐

