Terraform动态配置ignore_changes忽略Azure标签报错解决方法
Terraform的lifecycle元参数块在计划执行的最早期完成静态解析,这个阶段模板插值、函数调用、资源属性引用这类计算逻辑还未执行,因此ignore_changes中仅支持静态字面量形式的索引键,不支持动态拼接的键名,这就是你遇到报错的直接原因。
以下两种方案都可以解决问题,优先推荐第一种:
方案1:使用AzureRM Provider原生标签忽略规则(推荐)
从v3.0版本开始,AzureRM Provider原生提供ignore_tags配置能力,支持按精确键名、键前缀、键后缀全局配置不需要Terraform管理的标签,无需在单个资源的lifecycle块中处理动态键问题。
Azure自动添加的hidden-link类标签是平台用于资源关联的系统标签,本来就不需要纳入基础设施即代码的管理范围,直接在azurerm provider块中添加如下配置即可:
provider "azurerm" { features {} # 忽略Azure平台自动注入的hidden-link类关联标签 ignore_tags { key_prefixes = ["hidden-link:"] } }
该配置只会忽略匹配hidden-link:前缀的标签,你自定义的业务标签、环境标签的变更仍然会被正常检测、应用,没有副作用。配置完成后,所有资源上这类系统标签的新增、修改都不会触发Terraform的资源更新或重建操作,一次配置全局生效,无需为每个资源单独编写lifecycle规则。
方案2:硬编码目标标签键(适合仅需处理单个资源的场景)
如果你不想做全局配置,且当前环境的订阅ID、资源组名、Application Insights实例名不会频繁变更,直接将拼接完成的完整标签键硬编码到ignore_changes中即可,你自己也验证过这种方式可以正常生效,这类基础环境配置的变动频率极低,硬编码的维护成本几乎可以忽略。
可以先通过terraform output打印azurerm_application_insights.main.id的值,hidden-link:拼接这个值就是完整的标签键,不需要逐段拼接订阅ID、资源组名、资源名字段,减少拼接错误的概率。
内容的提问来源于stack exchange,提问作者Will

