59

我正在重构一些 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消息。

删除和重新添加的任何快捷方式?

4

6 回答 6

53

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

在这种特殊情况下,这似乎正在发生,因为provider您的一个子模块中有一个配置块。虽然允许与旧版本的 Terraform 兼容,但建议您仅provider在根模块中包含块,以便它们始终能够比提供者管理的任何资源实例寿命长。

如果您的意图是销毁其中的资源实例,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它里面的块。

于 2019-10-15T22:13:40.493 回答
5

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

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

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

通过别名传递提供者,

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

   providers = {
    aws = "aws.alias_name"
  }
}
于 2020-02-09T13:50:26.437 回答
5

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

遵循显式提供者源位置以与 Terraform v0.13 对齐可能是正确的方法,但与此同时,降级到 v0.12已经解决了这个问题。

于 2020-10-01T21:51:48.130 回答
3

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

于 2020-09-02T02:23:12.877 回答
2

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

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

于 2021-05-26T22:34:39.653 回答
-2

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

于 2021-11-12T14:49:17.547 回答