Terraform 升级至 0.15,对于我们不使用的提供商,获取“无效的旧提供商地址”

Terraform 升级至 0.15,对于我们不使用的提供商,获取“无效的旧提供商地址”

笔记:这是一个自我回答的问题,可以帮助处于类似情况的任何人。

将 Terraform 升级到 0.15 时,我们收到以下错误消息(以及awsrandom提供商的类似消息):

> terraform -chdir=aws init --upgrade

Upgrading modules...
Downloading [email protected]:penngineering/ops-terraform-lambda.git?ref=tf-15 for stream_handler...
- stream_handler in .terraform/modules/stream_handler
Initializing the backend...
Successfully configured the backend "s3"! 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 "pagerduty".
│ You must complete the Terraform 0.13 upgrade process before upgrading to later versions.
...

但是,我们不使用pagerduty提供程序,我们的根模块引用的任何模块也不使用。运行terraform providers将给出以下输出:

Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/archive] 2.2.0
├── provider[registry.terraform.io/hashicorp/aws] 3.39.0
├── provider[registry.terraform.io/hashicorp/local] 2.1.0
├── provider[registry.terraform.io/hashicorp/null] 3.1.0
└── provider[registry.terraform.io/hashicorp/random] 3.1.0
Providers required by state:
    provider[registry.terraform.io/hashicorp/aws]
    provider[registry.terraform.io/hashicorp/local]
    provider[registry.terraform.io/hashicorp/null]
    provider[registry.terraform.io/hashicorp/random]
    provider[terraform.io/builtin/terraform]
    provider[registry.terraform.io/hashicorp/archive]

下载外部状态并查找提供商会显示相同的提供商列表。

启用日志记录没有帮助:我们可以看到 Terraform 在哪里进行调用以检索远程状态,然后它打印了错误消息并退出。没有迹象表明它正在做什么来尝试找出提供商配置。

谷歌搜索没有找到太多结果;在大多数情况下,人们没有正确完成 0.13 升级。我们确实更新了状态,即提供商名称与我们的required_providers配置完全匹配,如下所示这个 StackOverflow 答案,但没有帮助。

答案1

谷歌搜索确实出现了此主题,这让我们找到了答案。

Terraform 具有“默认”工作区的概念,如果您在运行时terraform init没有指定工作区,它将基于此工作区进行初始化。但是,我们不使用默认工作区;我们的每个根模块都在一个明确的工作区中。

我们的构建过程terraform workspace select ...之前使用了planapply。但是您无法通过这种方式选择工作区,直到您init。并且init正在使用默认工作区(我猜它在 Terraform 二进制文件中有一个实际的默认配置,用于初始化全新的项目)。

解决方案是使用TF_WORKSPACE环境变量运行时init(我们现在到处使用它):

TF_WORKSPACE=${WORKSPACE} terraform -chdir=${MODULE} init --upgrade 

相关内容