首页 > 解决方案 > Terraform - API 以不同的顺序返回数据,所以 terraform 看到了毫无意义的变化?

问题描述

我看到 terraform 想要更改资源以进行无意义的更改(通常与列表类型事物的排序有关)。例如下面,这个资源没有改变,只是排序从 API 返回了这个特定的运行。

我可以更改任何内容以防止这些无意义的更改出现在计划和申请中吗?应用程序网关和它的许多块是我看到这种情况发生的另一个例子。

# azurerm_web_application_firewall_policy.owasp_only will be updated in-place
  ~ resource "azurerm_web_application_firewall_policy" "owasp_only" {
        id                  = "/subscriptions/ReallingInterestingGUID/resourceGroups/rg-apim/providers/Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/ccr-owasp-only"
        name                = "ccr-owasp-only"
        tags                = {
            "created-by"      = bob.jones@jones.com
            "terraform-stack" = "api-gateway"
        }
        # (4 unchanged attributes hidden)

      ~ managed_rules {

          ~ managed_rule_set {
              ~ type    = "Microsoft_BotManagerRuleSet" -> "OWASP"
              ~ version = "0.1" -> "2.2.9"
            }
          ~ managed_rule_set {
              ~ type    = "OWASP" -> "Microsoft_BotManagerRuleSet"
              ~ version = "2.2.9" -> "0.1"
            }
       }

        # (1 unchanged block hidden)
    }

标签: terraformterraform-provider-azure

解决方案


在 Terraform 提供者将基于 API 的规范化误解为漂移的情况下,一般的直接答案是更改您的配置以匹配远程系统期望的规范化形式。

在您的情况下,这似乎意味着交换managed_rule_set配置中两个块的顺序,以便顺序与远程 API 认为的规范化表示相匹配。

不幸的是,这些规范化规则并没有在远程系统文档中得到全面的详细记录,因此开发人员在实现 Terraform 提供程序集成时可能会错过它们。对此的“真正”答案是将缺少的逻辑添加到提供程序,以允许它识别远程系统何时认为两个配置是等效的,但当然这通常不是您可以立即执行的操作,而是必须等待对于包含该附加逻辑的提供程序的新版本。因此,使您的配置与远程系统的期望相匹配是一个更实际的更改,您可以在不更改提供程序版本的情况下进行更改。


推荐阅读