处理Terraform 0.14升级时出现的错误

当v0.12升级到v0.13时,由于草率地升级,我遭遇了一些不愉快的经历。
所以在v0.14的升级上犹豫不决。
不知不觉中,已经发布了v1.0版本。

有这种情况时,最好是准备好自动化测试来确保它没有出现问题。
但我还没有做到!

这次讲的是关于v0.14升级时遇到的错误,主要是讨论同时上升两个版本会发生什么样的情况。对于这个标题有点像欺骗,抱歉。

在升级到后续版本之前,你必须完成Terraform 0.13的升级过程。

如果您尝试在v0.12状态中使用v0.14的terraform进行init时,将发生上述情况。terraform官方文档建议逐个升级版本。

Terraform只支持一次性升级一个主要发布版本的工具和功能,所以如果你现在使用的是v0.13之前的Terraform版本,请先通过所有中间版本的最新小版本进行升级,查看先前的升级指南,了解可能与你相关的注意事项。

我们在讨论从v0.13升级到v0.14的问题,为什么会提到v0.12呢?
因为在升级到v0.13时,没有做好的工作。

在我的环境中,我以一定程度的细粒度将terraform的目录分成了多个部分。
在升级到v0.13时,只升级了有更新的目录。
结果是,没有更新的目录仍然保持着v0.12版本的tfstate状态。

然后这次,在反思之前的更新的基础上,试图一口气升级到v0.14,但是发生了这个错误。
由于升级方法的差异,导致了一个微妙的配合问题。

对策就是在 v0.13 的 Terraform 中执行 terraform apply。当然,在执行时要注意是否有差异。

错误:状态快照是由Terraform v0.14.11创建的,比当前版本v0.13.5更新;请升级至Terraform v0.14.11或更高版本以使用此状态。

这个错误是在使用v0.13的terraform进行terraform apply时,作为前面提到的错误处理而出现的。
这个错误会在加载terraform_remote_state的data块时发生。

我从tfstate的输出中读取了安全组(security_group)和subnetid的部分。但是,如果tfstate是新版本,例如v0.13.5,就无法读取。

我说过把它分成多个目录。

terraform - dir1/xxx.tf (v0.14のtfstate)
          - dir2/yyy.tf (v0.12のtfstate) (xxx.tfのリソースを参照)

由于目前的状态,首先需要将dir2的资源升级到terraform v0.13。
如果尝试进行前面提到的处理,data “terraform_remote_state” “xxxxx” 将无法加载,因为它是v0.14.5的版本,会导致错误。

总结起来

    • dir2をv0.13に上げなくてはならない

 

    • dir2をv0.13に上げるためには、dir1のtfstateをv0.13に戻さなければいけない

 

    dir1のtfstateはすでにv0.14になっている

这是这种状态。

在这里有两种处理方式可以考虑。
一种是在代码中将dir2更改为v0.14,然后逐步进行terraform import。
这样做的话,资源越多就会感到越困难。

另一种方法是将dir1的tfstate回退到v0.13。
由于s3的版本控制,我们可以回退到之前的状态。
虽然我们可以直接恢复s3引用的版本,但在这里我们选择下载旧版本,并将引用指向本地文件来处理。

data "terraform_remote_state" "network" {
  backend = "s3"
  config = {
    bucket = "xxxxx"
    key    = "terraform.tfstate"
  }
}
aws s3api get-object --bucket --key terraform.tfstate --version-id xxxxxxxxxx ./terraform.tfstate.network.v13
data "terraform_remote_state" "network" {
  backend = "local"
  config = {
    path = "./terraform.tfstate.network.v13"
  }
}

首先,这并不是terraform_remote_state,而是使用类似于https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnet_ids这样的数据源,如果使用了这样的数据源,就不会出现问题。

在最开始使用的时候,我并没有太多意识地使用远程状态,但最近我发现容易陷入这种情况,所以开始利用数据源。

結果

terraform升级是指

通过升级tfstate的terraform版本来使其保持与升级后的版本一致,仅仅调整语法是不够的。

在应用之前,这就是Terraform的升级步骤。请小心进行。

广告
将在 10 秒后关闭
bannerAds