笔记:这是一个自我回答的问题,可以帮助处于类似情况的任何人。
将 Terraform 升级到 0.15 时,我们收到以下错误消息(以及aws
和random
提供商的类似消息):
> 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 ...
之前使用了plan
和apply
。但是您无法通过这种方式选择工作区,直到您init
。并且init
正在使用默认工作区(我猜它在 Terraform 二进制文件中有一个实际的默认配置,用于初始化全新的项目)。
解决方案是使用TF_WORKSPACE
环境变量运行时init
(我们现在到处使用它):
TF_WORKSPACE=${WORKSPACE} terraform -chdir=${MODULE} init --upgrade