Terraform中azurerm_policy_definition报错:对象无id属性的问题咨询
问题分析与解决
核心原因
你的azurerm_policy_definition资源大概率在模块中使用了count或for_each参数,这会让资源变成集合类型(列表/映射),而非单个对象。直接访问.id会报错,因为集合本身没有id属性,只有集合内的单个元素才具备该属性。
对应解决方法
场景1:资源使用了count
如果模块里的Policy定义通过count批量创建,输出时需要指定索引(以第一个实例为例):
output "policy_definition_id" { type = string description = "策略定义的ID" value = azurerm_policy_definition.example[0].id }
若要输出所有实例的ID,可返回列表:
output "policy_definition_ids" { type = list(string) description = "所有策略定义的ID列表" value = [for p in azurerm_policy_definition.example : p.id] }
场景2:资源使用了for_each
如果用for_each创建资源(映射类型),输出单个ID需指定对应键名:
output "policy_definition_id" { type = string description = "指定键对应的策略定义ID" value = azurerm_policy_definition.example["your-key"].id }
输出所有ID可返回映射结构:
output "policy_definition_ids" { type = map(string) description = "所有策略定义的ID映射" value = { for k, p in azurerm_policy_definition.example : k => p.id } }
场景3:资源名称不匹配
检查output.tf中引用的资源名称,是否与main.tf里azurerm_policy_definition的资源名称完全一致。比如main里定义的是azurerm_policy_definition.my_policy,输出里就不能写成azurerm_policy_definition.example,名称不匹配也会触发属性找不到的报错。
验证步骤
- 打开模块的
main.tf,确认azurerm_policy_definition是否配置了count/for_each; - 根据资源类型调整
output.tf的引用方式; - 执行
terraform plan验证报错是否消失。
内容的提问来源于stack exchange,提问作者Or Allony
相关产品推荐
相关产品推荐

