由于在Terraform Cloud上出现了“无法设置此字段”的错误,因此需要对terraform和tfstate文件进行版本升级

有一种方法可以将GitHub仓库和Terraform Cloud结合起来,用来管理OCI(Oracle Cloud Infrastructure)的资源。

Terraform Cloud是一个在云上自动执行Terraform的服务,与GitHub进行协作时,会执行以下处理。

    • PR作成時にterraform planが実行される

 

    masterブランチにpush or mergeされるとterraform applyが実行される

因为编写PR并等待在Terraform Cloud上执行太麻烦,所以我下载了来自Terraform Cloud的tfstate文件,然后在本地PC上执行terraform plan/apply。

在这种情况下,出现了一个错误,错误信息为“无法设置此字段”。

升级Terraform的版本

首先,按照terraform官方网站的指示创建了tf文件,但在应用terraform apply时出现了错误。

$ terraform apply

Error: "ip_address_details": this field cannot be set

  on network.tf line 77, in resource "oci_load_balancer_load_balancer" "lb01":
  77: resource "oci_load_balancer_load_balancer" "lb01" {

在官方网站上有故障排除方法写着。

故障排除 | 指南 | hashicorp/oci | Terraform 注册表

根据上述所述的内容,据称这是在Terraform版本过旧时出现的情况。

$ terraform --version
Terraform v0.12.36

在使用brew upgrade terraform命令升级后,执行terraform init时出现了不同的错误。

$ terraform --version
Terraform v0.14.5

$ terraform init

Initializing the backend...

Error: Invalid legacy provider address

This configuration or its associated state refers to the unqualified provider
"oci".

You must complete the Terraform 0.13 upgrade process before upgrading to later
versions.

出现了提供者的注册表过时的错误。

供应商更新

升级到 Terraform v0.13 – 由 HashiCorp 提供的 Terraform

我使用的供应商如下所示

$ terraform providers

Providers required by configuration:
.
└── provider[registry.terraform.io/hashicorp/oci]

Providers required by state:

    provider[registry.terraform.io/-/oci]

试着更新提供者

$ terraform state replace-provider -- -/oci registry.terraform.io/hashicorp/oci
Terraform will perform the following actions:

  ~ Updating provider:
    - registry.terraform.io/-/oci
    + registry.terraform.io/hashicorp/oci

Changing 10 resources:

  oci_core_route_table.rt01
  oci_core_security_list.sl_web
  data.oci_identity_availability_domains.ads
  oci_core_instance.ubuntu02
  data.oci_core_public_ip.public_ip01
  oci_core_internet_gateway.ig01
  oci_core_instance.ubuntu01
  oci_core_subnet.subnet01
  data.oci_load_balancer_load_balancers.lb_test
  oci_core_virtual_network.vcn01

Do you want to make these changes?
Only 'yes' will be accepted to continue.

Enter a value: <yesを入力>

Successfully replaced provider for 10 resources.

看起来已经成功更新了,这样terraform init就能顺利执行了。

$ terraform providers

Providers required by configuration:
.
└── provider[registry.terraform.io/hashicorp/oci]

Providers required by state:

    provider[registry.terraform.io/hashicorp/oci]

不过,在terraform cloud上进行terraform init时出现了错误。
这个错误与在本地发生的错误相同。

Terraform v0.14.5
Configuring remote state backend...
Initializing Terraform configuration...

Setup failed: Failed terraform init (exit 1): <nil>

Output:

Initializing the backend...

Successfully configured the backend "remote"! Terraform will automatically
use this backend unless the backend configuration changes.

Error: Invalid legacy provider address

This configuration or its associated state refers to the unqualified provider
"oci".

You must complete the Terraform 0.13 upgrade process before upgrading to later
versions.

升级tfstate文件的版本

Terraform错误:无效的旧版提供者地址。

当我尝试查找错误原因时,发现了一个很重要的事实:当terraform的版本与tfstate文件的版本不一致时,会引发该错误。具体而言,由于terraform版本为”0.14.X”,而tfstate文件的版本却是”0.12.X”,这导致了错误的发生。

{
  "version": 4,
  "terraform_version": "0.12.4",
  "serial": 27,

...

在本地环境中,当更新提供程序时,tfstate文件也会被更新。
实际上,当更新提供程序时,会创建一个旧版本的tfstate.backup文件。

然而,在Terraform Cloud中,可以指定terraform的版本,但无法更新tfstate的版本。
需要先以0.13.X版本运行terraform apply,然后手动将tfstate文件进行版本更新。

尽管可以通过Web上的队列重新执行,但如果terraform plan没有更改,则不会执行terraform apply,并且tfstate文件也不会被更新。

更新Terraform Cloud的tfstate文件

这是一种传统的方法,目前除此之外没有其他方式。

    1. 登录Terraform Cloud后,转到“Workspace”页面

 

    1. 在“Settings” > “General”中将版本更改为“0.13.X”

 

    1. 在GitHub的master分支上进行适当的commit,以使tfstate文件发生变化

 

    1. 在Terraform Cloud中执行terraform apply命令

 

    tfstate文件也将变为“0.13.X”。

只要执行与此相同的操作,tfstate文件就会在升级到0.14.X版本时进行更新。

广告
将在 10 秒后关闭
bannerAds