Terraform合并Log Analytics变量失败:resource_group_name属性不存在
Terraform Log Analytics工作区变量合并错误修复
问题现象
执行Terraform代码时,引用local.laws中的resource_group_name属性触发错误:
│ Error: Unsupported attribute │ │ on modules/loganalytics/main.tf line 17, in data "azurerm_resource_group" "resource_groups": │ 17: name = each.value.resource_group_name │ ├──────────────── │ │ each.value is object with 1 attribute "law-eastus-dev-01" │ │ This object does not have an attribute named "resource_group_name".
错误原因
- 合并逻辑缺失:原
locals中的merge仅添加了三个新属性,没有将原变量law的属性(如resource_group_name)合并进去,导致生成的对象不包含原有字段。 - 语法错误:在
locals中错误使用了for_each关键字,正确的映射生成应该直接使用Terraform的for表达式,不需要外层的for_each包装,这导致local.laws的结构完全不符合预期。
修复方案
修正locals中的代码,正确合并原变量属性与新增属性,同时移除错误的for_each关键字:
locals { laws = { for law in var.log_analytics_workspace : law.name => merge( law, # 先传入原对象,保留所有原有属性 { internet_ingestion_enabled = false internet_query_enabled = false cmk_for_query_forced = false } ) } }
关键说明
- 使用
merge(law, { ... })将原工作区对象的所有属性与新增的三个配置项合并,确保生成的对象包含resource_group_name等原有字段。 - 直接通过
for表达式生成以工作区名称为键的映射,不需要额外的for_each包装,这样local.laws的结构符合后续数据源for_each的遍历要求。
修复后的完整代码示例
# 变量定义(保持不变) variable "log_analytics_workspace" { description = "A list of log analytics workspaces and their arguments." type = list(object({ name = string resource_group_name = string location = string sku = string #Free, PerNode, Premium, Standard, Standalone, Unlimited, CapacityReservation, and PerGB2018. Defaults to PerGB2018. retention_in_days = number #Possible values are either 7 (Free Tier only) or range between 30 and 730. daily_quota_gb = number #The workspace daily quota for ingestion in GB. Defaults to -1 (unlimited) if omitted. reservation_capacity_in_gb_per_day = number tags = map(string) })) } # 修正后的本地值定义 locals { laws = { for law in var.log_analytics_workspace : law.name => merge( law, { internet_ingestion_enabled = false internet_query_enabled = false cmk_for_query_forced = false } ) } } # 资源组数据源(保持调用逻辑不变) data "azurerm_resource_group" "resource_groups" { for_each = local.laws name = each.value.resource_group_name }
内容的提问来源于stack exchange,提问作者Vegas588
相关产品推荐
相关产品推荐

