2023年10月31日時点で、Google Cloud Platform v5のTerraformプロバイダーでは、tfmigrateが正常に利用できない場合があります

我认为有许多团队或企业在管理terraform资源时,会使用tfmigrate来代替直接输入import命令等。然而,由于hashicorp/terraform-provider-google针对Google Cloud的管理在v5之后引入了一些规范变更,因此可能会导致tfmigrate plan(apply)命令失败的情况。

在什么样的情况下会失败?

当需要导入具有labels字段的资源,例如BigQuery的Dataset时。
自terraform-provider-google v5.0.0起,它分为三种类型:labels,effective_labels和terraform_labels。

 

当涉及到此问题时,其影响主要在于导入时只有有效标签(effective_labels)被导入,而标签(labels)和terraform_labels则存在差异。

具体来说,会出现如下输出,tfmigrate plan等操作会失败。

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # module.data_platform.google_bigquery_dataset.sample_dataset will be updated in-place
  ~ resource "google_bigquery_dataset" "sample_dataset" {
        id                              = "projects/sample/datasets/sample_dataset"
      ~ labels                          = {
          + "env"     = "production"
        }
      ~ terraform_labels                = {
          + "env"     = "production"
          + "managed" = "terraform"
        }
        # (14 unchanged attributes hidden)

        # (6 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: /tmp/tfplan********

To perform exactly these actions, run the following command to apply:
    terraform apply "/tmp/tfplan********"

stderr:

由于effective_labels是实际应用的标签,而labels和terraform_labels似乎是terraform内部存在的,所以不可避免地会产生差异。

躲避方案

我认为不使用标签是困难的,所以暂时停止使用tfmigrate,改为使用terraform import terraform apply。
虽然会产生临时差异,但通过应用可以解决问题。

广告
将在 10 秒后关闭
bannerAds