"Invalid legacy provider address" 使用 terragrunt

"Invalid legacy provider address" using terragrunt

我希望有人可以帮助我解决 Terraform/Terragrunt 遇到的问题。我目前使用的每个版本是:

我正在使用 Terrag运行t 将项目相关基础架构部署到 GCP。我有两个单独的 Terrag运行t 项目,用于在同一 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.

我查看了其他人对此错误的建议,并找到了以下文章:

然而,其中的解决方案适用于 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 文件。

我注意到在测试实例中,在 .terragrunt-cache 文件夹下创建了一个 providers 文件夹,但是由于这个错误,它没有在生产实例中创建,可以如下所示:

此屏幕截图还显示了我注意到的两个 Terragrant 项目之间的另一个区别,生产实例正在生成一个 .terragrunt-init-required 文件,而这在测试实例中不存在。据我所知,这与生产实例需要初始化这一事实有关。

这些是我的 Terraform main.tf 文件的内容:

terraform {
  backend "gcs" {}
}

provider "google" {
  project = var.deployment_project_id
}

这些是我的 Terraform provider.tf 文件的内容(我将其添加为我在网上看到的建议的一部分,但测试 Terrag运行t 项目不需要初始化正确):

terraform {
  required_version = "~> 1.0.11"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 4.1.0"
    }
  }
}

这些文件都被我的 Terrag运行t .hcl 文件使用。对于如何解决此问题的任何帮助或想法,我将不胜感激。

您似乎拥有使用 Terraform v0.12 或更早版本创建的最新状态快照。这意味着它将以 Terraform v1.0 及更高版本不再支持的旧形式存储提供程序配置引用。

对于您的直接工作,我建议您只弄清楚此配置的关联状态是由哪个 Terraform 版本创建的,并使用该版本的最新补丁版本来完成您的工作,这样您就可以避免立即进行任何升级工作。为此,找到您当前的 Terraform 状态快照(请参阅后端配置以查看其存储位置),这将是一个 JSON 数据结构,存储在 Terraform 配置或 Terragrunt 配置中配置的某处。

在那个 JSON 对象中,将有一个名为 terraform_version 的顶级 属性,它将映射到 0.11.20.12.3 这样的字符串,或类似的。将该版本号的前两个元素作为 Terraform 主版本,然后参考 the list of available versions 并找到具有相同主版本号的最新版本。例如,如果您在状态文件中找到 0.11.2,那么在撰写本文时,您将 select Terraform 0.11.15,因为这是 v0.11 系列中的最新版本。

然后您应该能够使用该版本的 Terraform 来处理您当前的 Terraform 配置和状态。


一旦您知道您的配置当前期望的版本并且您准备好升级,您可以在那之后参考the Terraform v1.0 upgrade guide to see the recommended steps to get from whatever version you are currently using to a version after the v1.0.0 release, after which you can select the latest v1.*.* moving forward because they are all subject to compatibility promises

特别是,v1.0 升级指南链接到较早的从 v0.12 升级到 v0.13 的指南,其中包括超越您在问题中包含的错误消息的步骤。 (即错误消息所指的“Terraform 0.13 升级过程”。)