如何解决API返回数据顺序不同导致Terraform出现无意义变更的问题
解决Terraform Azure资源列表顺序变更触发无意义diff的方案
这类问题的核心是Terraform默认将嵌套块、列表类属性视为有序集合做一致性校验,而Azure OpenAPI返回WAF策略、应用网关这类资源时不保证元素返回顺序,元素无变更仅顺序调整时就会触发误报的更新计划。你可以通过以下几种配置解决:
- 方案1:升级azurerm provider到最新稳定版
AzureRM官方团队已经针对大量高频出问题的资源(包括WAF策略、应用网关)做了适配,将原本有序的List类型属性改为无序的Set类型存储,天然忽略顺序差异,只要集合内元素完全一致就不会产生diff。 - 方案2:配置输入时固定元素排序
定义资源属性时先对列表元素做固定规则排序,保证每次传入Terraform的配置顺序一致。比如针对你的WAF策略场景,可以把规则集先按type字段排序后再传入:locals { managed_rule_sets = sort([ { type = "Microsoft_BotManagerRuleSet" version = "0.1" }, { type = "OWASP" version = "2.2.9" } ]) } resource "azurerm_web_application_firewall_policy" "owasp_only" { # 其他基础配置省略 managed_rules { dynamic "managed_rule_set" { for_each = local.managed_rule_sets content { type = managed_rule_set.value.type version = managed_rule_set.value.version } } } } - 方案3:通过lifecycle元参数忽略顺序差异
如果以上两种方案都不适用,可以精准指定忽略对应字段的变更校验,只要元素内容没有变更就不会触发更新:resource "azurerm_web_application_firewall_policy" "owasp_only" { # 原有全部配置省略 lifecycle { ignore_changes = [ managed_rules[*].managed_rule_set ] } }
你给出的示例diff就是典型的规则集顺序变更导致的无意义变更,以上三种方案都可以解决该场景的问题,应用网关的多监听器、多路由规则场景也可以用相同的逻辑处理。
内容的提问来源于stack exchange,提问作者Chad Carlton
相关产品推荐
相关产品推荐

