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

Azure CAF企业级模块重命名变更跟踪数据收集规则报错

Terraform Azure CAF模块重命名变更跟踪数据收集规则时出现重复Key错误

在使用Terraform结合Azure CAF企业级模块时,修改management目录下settings.management文件的advanced块重命名数据收集规则(DCR)时,仅变更跟踪(change tracking)相关配置触发报错,其余类型的DCR重命名操作均正常。注释掉change_tracking块后,Terraform可正常执行,但无法完成该DCR的重命名。

报错信息

│ Error: Duplicate object key
│
│   on .terraform/modules/alz/locals.management.tf line 65, in locals:
│   63:   azurerm_monitor_data_collection_rule_management = {
│   64:     for resource in module.management_resources.configuration.azurerm_monitor_data_collection_rule :
│   65:     resource.resource_id => resource
│   66:     if resource.managed_by_module
│   67:   }
│     ├────────────────
│     │ resource.resource_id is "/subscriptions/**********/resourceGroups/rg-obs-plz-mgt-dev-uks/providers/Microsoft.Insights/dataCollectionRules/dcr-ct-plz-mgt-dev-uks-001"
│
│ Two different items produced the key
│ "/subscriptions/**************/resourceGroups/rg-obs-plz-mgt-dev-uks/providers/Microsoft.Insights/dataCollectionRules/dcr-ct-plz-mgt-dev-uks-001"
│ in this 'for' expression. If duplicates are expected, use the ellipsis
│ (...) after the value expression to enable grouping by key.
╵
##[warning]Can't find loc string for key: TerraformPlanFailed
##[error]Error: TerraformPlanFailed 1

当前配置片段

azurerm_data_collection_rule = {
  management = {
    vminsights = {
      name = "dcr-vw-${var.zone}-${var.environment}-uks-001"
    },
    change_tracking = {
      name = "dcr-ct-${var.zone}-${var.environment}-uks-001"
     },
     defendersql = {
      name = "dcr-def-${var.zone}-${var.environment}-uks-001"
     }
  }
}

解决方案

这个问题源于Azure CAF模块处理变更跟踪DCR时,默认会自动创建关联的辅助资源,手动重命名主DCR时,模块内部会同时生成新旧两个DCR的resource_id映射,导致for循环出现重复key。

方法一:先销毁旧DCR再重建

  1. 暂时注释配置中的change_tracking块,执行terraform apply销毁旧的变更跟踪DCR。
  2. 若状态文件仍残留旧DCR记录,执行以下命令移除:
    terraform state rm module.management_resources.azurerm_monitor_data_collection_rule.change_tracking
    
  3. 取消change_tracking块的注释,确保新名称配置正确,再次执行terraform apply创建新命名的DCR。

方法二:使用override参数强制覆盖

在change_tracking配置块中添加override = true,强制模块使用自定义配置,避免自动生成重复资源:

azurerm_data_collection_rule = {
  management = {
    change_tracking = {
      name = "dcr-ct-${var.zone}-${var.environment}-uks-001"
      override = true
    }
  }
}

注意:操作前务必备份Terraform状态文件,防止资源误操作。

内容的提问来源于stack exchange,提问作者Paul Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:09:57