【问题标题】:Updating Terraform Google provider forces replacement更新 Terraform Google 提供程序会强制更换
【发布时间】:2021-10-08 13:55:17
【问题描述】:

我正在尝试将 terraform google 提供程序从 3.55 更新为 3.58 以添加大查询删除保护。

运行terraform plan 时,我收到# forces replacement 警告:

# google_bigquery_table.my_table must be replaced
...
+ deletion_protection = true
...
~ schema              = jsonencode(
          ~ [ # forces replacement
              ~ {
                  ~ fields      = [
                        # (6 unchanged elements hidden)
                        {
                            description = "Location of the data schema."
                            name        = "dataSchema"
                            type        = "STRING"
                        },
                      ~ {
                          ~ type        = "BOOLEAN" -> "BOOL"
                            # (2 unchanged elements hidden)
                        },
                    ]
                  ~ type        = "RECORD" -> "STRUCT"
                    # (2 unchanged elements hidden)
                } # forces replacement,
              ~ {
                  ~ type        = "RECORD" -> "STRUCT"
                    # (3 unchanged elements hidden)
                } # forces replacement,
              ~ {
                  ~ type        = "RECORD" -> "STRUCT"
                    # (3 unchanged elements hidden)
                } # forces replacement,
            ]
        )

谁能帮助我理解 (a) 为什么在我没有更改架构的情况下强制替换此更新,以及 (b) 如何在不删除表中数据的情况下更新我的 google 提供程序。

任何帮助将不胜感激。

【问题讨论】:

  • 您是否在配置中指定表架构?
  • @MattSchuchard 是的,我在 schema 资源中的 schema 属性上定义了它们
  • 你不能把架构放在 ignore_changes 下吗?
  • @NathanRuiz 谢谢我不知道ignore_changes 存在。这样做是否会为下一次更新解决问题?还是我会无限期地将架构保留在 ignore_changes 下?
  • 它将忽略架构中所做的更改,因此只要它存在就不会在应用时导致任何更新,缺点是:如果您需要从头开始复制您的环境,您将得到任何设置在 terraform 上,可能无法反映实际数据。但除此之外,它工作得很好。更多信息terraform.io/docs/language/meta-arguments/lifecycle.html

标签: google-bigquery terraform terraform-provider-gcp


【解决方案1】:

有时,Terraform 似乎在标记需要更换方面非常激进。我不确定它是否相关,但我在更改 Terraform 版本时有时会看到更“保守”的标记(保守的意思是它似乎更频繁地尝试替换 - 我不确定升级后的版本是否'没有意识到以前无法在 TF 中设置但现在可以设置的设置被标记为可能已更改,因此需要替换)。我同意,如果您的架构没有更改,则无需替换资源。

解决方案

通过确保在资源主体的lifecycle 块中指定资源,将资源标识为ignore_changes

来自Terraform documentation

ignore_changes 功能旨在在创建资源时使用,其中引用了将来可能会更改的数据,但在创建后不应影响所述资源。在极少数情况下,远程对象的设置会被 Terraform 之外的进程修改,然后 Terraform 会在下次运行时尝试“修复”这些设置。为了使 Terraform 与单独的进程共享单个对象的管理职责,ignore_changes 元参数指定了 Terraform 在计划更新相关远程对象时应忽略的资源属性。

其中的一些示例代码:

resource "aws_instance" "example" {
  # ...
  lifecycle {
    ignore_changes = [
      # Ignore changes to tags, e.g. because a management agent
      # updates these based on some ruleset managed elsewhere.
      tags,
    ]
  }
}

另请注意,您可以使用关键字all 而不是ignore_changes 中的列表来忽略所有属性。

【讨论】:

  • @RobotEyes 你认为ignore_changes会解决问题吗?
  • 我不确定。添加架构以无限期地忽略意味着我将来无法更新我的架构。我假设一旦从忽略更改块中删除架构,我就会再次遇到同样的问题。这是正确的吗?
  • @RobotEyes 是的。就像我提到的那样,似乎在升级后我对这些东西的“敏感性”得到了提高,然后我可以在新应用后删除(至少通常如此)。我希望他们的发行说明能更好地识别导致问题的更改类型。
猜你喜欢
  • 2021-10-08
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多