使用 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 initterragrunt 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.20.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 集群

带有 Terraform 的 Google Cloud 凭据

最牛逼的集群监控系统,它始终位列第一。。

怎么在windows下安装grunt

秒表的使用方法和技巧(秒表的使用方法)

使用“使用严格”作为“使用强”的备份