Terraform-重构模块:错误:提供程序配置不存在

时间:2019-10-15 11:10:38

标签: terraform terraform-modules

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

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

6 个答案:

答案 0 :(得分:3)

您可以注释掉要破坏的模块中的临时资源,在重新创建时取消注释资源,可以按照以下步骤操作,以免出错。

从模块中删除提供程序,并在模块中显式删除Pass提供程序,

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

具有别名的通行证提供者,

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

将Terraform v0.12升级到 v0.13 后,我开始出现此 Provider配置不存在错误。

遵循explicit-provider-source-locations以与Terraform v0.13保持一致可能是正确的方法,但是与此同时,降级到v0.12 已解决了这一问题。

答案 3 :(得分: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"块而不会看到“ Provider configuration not present”错误,因为在该状态下将没有资源实例依赖于该提供程序配置。

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

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

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

答案 4 :(得分:0)

就我而言,我重命名了模块

module "modules" {
  source            = "../Infrastructure"

 }

module "us-east-2" {
  source            = "../Infrastructure"

 }

答案 5 :(得分:0)

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

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