使用 terragrunt 的“无效的旧提供程序地址”
Posted
技术标签:
【中文标题】使用 terragrunt 的“无效的旧提供程序地址”【英文标题】:"Invalid legacy provider address" using terragrunt 【发布时间】:2022-01-04 10:52:49 【问题描述】:我希望有人可以帮助我解决 Terraform/Terragrunt 遇到的问题。我目前使用的每个版本是:
Terragrunt v0.35.9 Terraform v1.0.11我正在使用 Terragrunt 将项目相关的基础架构部署到 GCP。我有两个单独的 Terragrunt 项目,用于在同一 GCP 解决方案的测试和生产实例之间拆分变量。
当我使用测试 .hcl 文件运行命令 terragrunt init
或 terragrunt plan -out tf.plan
时,该过程按预期完成。但是,当我使用生产 .hcl 文件运行这些命令中的任何一个时,都会出现以下错误:
│ Error: Invalid legacy provider address
│
│ This configuration or its associated state refers to the unqualified
│ provider "google".
│
│ You must complete the Terraform 0.13 upgrade process before upgrading to
│ later versions.
我查看了其他人对此错误的建议,并找到了以下文章:
"Invalid legacy provider address" error on Terraform https://stackguides.com/questions/65396812/invalid-legacy-provider-address-error-on-terraform但是,其中的解决方案适用于 Terraform 的版本在当前版本之前而不是之后的情况,就像我在 v1.0.11
上一样。此外,他们建议使用replace-provider
命令替换提供程序。但是,在我的 terraform 项目中,GCP 提供程序似乎已经是最新的,因为当我运行 terraform providers
命令时,我得到:
Providers required by configuration:
.
└── provider[registry.terraform.io/hashicorp/google] ~> 4.1.0
对于v0.13.x
之后的 Terraform 版本,这似乎是正确格式的 GCP 提供程序。
我还尝试删除生产实例的.terragrunt-cache
文件夹和关联的锁定文件,并尝试重新运行terragrunt init
命令,但我一直收到相同的错误。我觉得这很令人困惑,因为这适用于测试 .hcl 文件,它使用相同的底层 Terraform .tf 文件。
我注意到,在测试实例中,providers
文件夹正在.terragrunt-cache
文件夹下创建,但是由于此错误,它没有在生产实例中创建,如下所示:
此屏幕截图还显示了我注意到的两个 Terragrant 项目之间的另一个区别,生产实例正在生成一个 .terragrunt-init-required
文件,而测试实例中不存在该文件。据我所知,这与生产实例需要初始化这一事实有关。
这些是我的 Terraform main.tf 文件的内容:
terraform
backend "gcs"
provider "google"
project = var.deployment_project_id
这些是我的 Terraform provider.tf 文件的内容(我在网上看到的建议中添加了该文件,但测试 Terragrunt 项目不需要正确初始化):
terraform
required_version = "~> 1.0.11"
required_providers
google =
source = "hashicorp/google"
version = "~> 4.1.0"
我的 Terragrunt .hcl 文件都使用了这些文件。如果您提供有关如何解决此问题的任何帮助或想法,我将不胜感激。
【问题讨论】:
【参考方案1】:您似乎拥有使用 Terraform v0.12 或更早版本创建的最新状态快照。这意味着它将以 Terraform v1.0 及更高版本不再支持的旧形式存储提供程序配置引用。
对于您的直接工作,我建议您只需弄清楚该配置的关联状态是由哪个 Terraform 版本创建的,并使用该版本的最新补丁版本来完成您的工作,这样您就可以避免立即进行任何升级工作。为此,请找到您当前的 Terraform 状态快照(请参阅后端配置以查看其存储位置),它将是存储在 Terraform 配置或 Terragrunt 配置中配置的某个位置的 JSON 数据结构。
在该 JSON 对象中,将有一个名为 terraform_version
的***属性,它将映射到类似 0.11.2
或 0.12.3
或类似的字符串。将该版本号的前两个元素作为 Terraform 主要版本,然后参考 the list of available versions 并找到具有相同主要版本号的最新版本。例如,如果您在状态文件中找到 0.11.2
,那么在撰写本文时您会选择 Terraform 0.11.15,因为这是 v0.11 系列中的最新版本。
然后,您应该能够使用该版本的 Terraform 来处理您当前的 Terraform 配置和状态。
一旦您知道您的配置当前需要哪个版本并且您已准备好升级,您可以咨询the Terraform v1.0 upgrade guide 以查看从您当前使用的任何版本升级到v1.0.0 之后的版本,之后你可以选择最新的v1.*.*
,因为在那之后它们都受compatibility promises的约束。
特别是,v1.0 升级指南链接到从 v0.12 迁移到 v0.13 的早期指南,其中包括超出您问题中包含的错误消息的步骤。 (即错误消息所指的“Terraform 0.13升级过程”。)
【讨论】:
谢谢@Martin,这确实是问题所在。我设法使用tfenf 安装并切换到 Terraform 的 v0.13。然后我执行了0.13upgrade
命令。然后我做了一个init --reconfigure
,然后又做了一个apply
,因为这是v01.3升级后的required。在此之后,我能够换回最新版本的 terraform 并继续使用我最初尝试完成的 apply
。感谢您对此的帮助!以上是关于使用 terragrunt 的“无效的旧提供程序地址”的主要内容,如果未能解决你的问题,请参考以下文章
使用 terraform/terragrunt 创建多个共享相同子网组和安全组的 redshift 集群