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

Sno*_*ash 39 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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ins 35

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

在这种特殊情况下,这似乎是因为provider您的一个子模块中有一个配置块。虽然为了与旧版本的 Terraform 兼容而允许这样做,但建议provider您的根模块中只包含块,以便它们始终比提供程序管理的任何资源实例存活时间更长。

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

terraform destroy -target=module.my_module
Run Code Online (Sandbox Code Playgroud)

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

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

terraform state mv 'module.my_module.some_resource.resource_name' 'module.other_module.some_resource.resource_name'
Run Code Online (Sandbox Code Playgroud)

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

  • 你帮助我更接近于认为我“几乎”理解了这个叫做 Terraform 的疯狂事物...... (9认同)
  • “terraform mv”命令现在是“terraform state mv”。请参阅 https://www.terraform.io/docs/commands/state/mv.html (3认同)
  • `-target` 标志就是我所需要的。你救了我。 (3认同)

Piy*_*gra 7

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

从模块中删除提供程序并显式传递模块中的提供程序,

module "pass_provider" {
  source = "../module"
   providers = {
    aws = aws
  }
}
Run Code Online (Sandbox Code Playgroud)

通过别名传递提供商,

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

   providers = {
    aws = "aws.alias_name"
  }
}
Run Code Online (Sandbox Code Playgroud)


Noa*_*nos 5

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

按照显式提供者源位置与 Terraform v0.13 保持一致可能是正确的方法,但与此同时,降级到 v0.12已经解决了它。