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。
虽然会产生临时差异,但通过应用可以解决问题。