【问题标题】:Terraform - refactoring modules: Error: Provider configuration not presentTerraform - 重构模块:错误:提供程序配置不存在
【发布时间】:2020-02-12 01:16:47
【问题描述】:

我正在重构一些 Terraform 模块并得到:

Error: Provider configuration not present

To work with
module.my_module.some_resource.resource_name its
original provider configuration at
module.my_module.provider.some_provider.provider_name is required, but it
has been removed. This occurs when a provider configuration is removed while
objects created by that provider still exist in the state. Re-add the provider
configuration to destroy
module.my_module.some_resource.resource_name, after
which you can remove the provider configuration again.

看来我需要从 tfstate 文件中删除该资源,然后使用新的 tf 配置重新添加它。

当我重构一些单体代码时,有数百条 Error: Provider configuration not present 消息。

有删除和重新添加的快捷方式吗?

【问题讨论】:

  • 如果你不需要处理资源的存在你可以直接修改状态:terraform state rm module.my_module.some_resource.resource_name

标签: terraform terraform-modules


【解决方案1】:

正如错误消息所解释的,Terraform 检测到资源对象仍处于提供者配置不可用的状态,因此它没有足够的信息来销毁这些资源。

在这种特殊情况下,这似乎是因为您的一个子模块中有一个provider 配置块。虽然这是为了与旧版本的 Terraform 兼容而允许的,it's recommended to only have provider blocks in your root module 以便它们始终能够比提供者管理的任何资源实例寿命更长。

如果您的意图是销毁module.my_module 中的资源实例,那么您必须在从根模块中删除module "my_module" 块之前执行此操作。这是一种不寻常的情况,我们可以使用 -target 来帮助 Terraform 了解我们想要它做什么:

terraform destroy -target=module.my_module

一旦所有这些对象都被销毁,您应该能够删除module "my_module" 块而不会看到“提供程序配置不存在”错误,因为在该状态下将不存在依赖该提供程序配置的资源实例。

如果您的目标是将资源块移动到另一个模块中,这里的另一个可能的解决方案是使用terraform state mv 指示 Terraform 跟踪新地址下的现有对象:

terraform state mv 'module.my_module.some_resource.resource_name' 'module.other_module.some_resource.resource_name'

同样,最好在删除旧模块之前执行此操作,这样旧的提供程序配置就会一直存在,直到没有任何东西可以管理。在您将现有对象移动到状态中的新模块并在配置中为其设置 resource 块后,Terraform 应该了解您从现在开始使用不同的提供者配置管理此资源的意图,您可以安全地移除旧的 module 块,从而移除其中的 provider 块。

【讨论】:

  • 你帮助我更接近于认为我几乎理解这个叫做 Terraform 的疯狂东西......
  • terraform mv 命令现在是 terraform state mv。见terraform.io/docs/commands/state/mv.html
  • -target 标志就是我所需要的。你救了我。
  • 从这里到达那里,使用命令 - terraform destroy -target="module.my_module"
  • 如果我们想按原样保留资源,而只是使用不同的提供者怎么办?除了手动编辑状态文件之外,我还没有找到解决方案。
【解决方案2】:

您可以将要销毁的模块中的资源临时注释掉,重新创建时取消注释资源,您可以按照以下步骤避免错误。

从模块中移除提供者并在模块中显式传递提供者,

module "pass_provider" {
  source = "../module"
   providers = {
    aws = aws
  }
}

使用别名传递提供者,

module "pass_provider_alias" {
  source = "../module"

   providers = {
    aws = "aws.alias_name"
  }
}

【讨论】:

    【解决方案3】:

    将 Terraform v0.12 升级到 v0.13 后,我开始收到此 Provider configuration not present 错误。

    按照explicit-provider-source-locations 与 Terraform v0.13 对齐应该是正确的方法,但与此同时,降级到 v0.12 已经解决了。

    【讨论】:

      【解决方案4】:

      如果您在团队中工作,首先要检查的是验证用于构建的 terraform 的最后一个版本,如果您的版本是其他版本,请更改并测试。此类问题的一个示例:https://github.com/hashicorp/terraform/issues/26062

      【讨论】:

      • 这应该是更高的排名。这是我的真正原因。
      • 对于未来的人:运行 terraform 计划并应用,即使 0 事情发生变化。这将强制更新状态文件的 tf 版本,然后误导性错误消失。
      【解决方案5】:

      如果您注释掉/删除了一个模块并看到此错误,那么另一个选项是 terraform state rm 基本上可以忘记它。 Terraform state rm

      您肯定想要销毁资源terraform destroy -target=module.mymodule,但在某些情况下资源不是物理资源,例如模块中的random。此外,如果您使用的是 Terraform Cloud 并且工作区是 VCS 链接的,那么您将无法在本地运行 applydestroy。在这些情况下,请使用rm,如果有延迟资源,只需手动删除它们。

      【讨论】:

        【解决方案6】:

        首先,删除与您尝试删除(并应用)的提供者相关的资源。然后删除提供程序。

        【讨论】:

          猜你喜欢
          • 2021-08-04
          • 2021-09-28
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 2021-01-03
          • 2021-05-29
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多