为什么我无法在具有提供者配置的模块中添加 depends_on 块?

9
当我为我的Terraform模块编写示例时,出现了以下错误:“模块包含提供程序配置”,“使用count、for_each或depends_on无法在模块内配置提供程序”。
当我尝试向模块声明添加一个depends_on块以避免在部署模块内的资源之前运行模块计划所需的资源组的创建时,就会出现此错误。
如果我不添加depends_on块,它也会出错,因为它找不到应该在模块运行以填充所需的资源组数据源之前创建的已声明的资源组。
我发现要求删除providers块或删除所有数据源至少是不舒服的。
我找不到有关此错误或如何修复它的任何详细信息。 Terraform代码中引发此错误的特定行。

我不确定 depends_on,但我知道在包含提供程序块的模块资源中使用 for_each 是可能的。您使用的 Terraform 版本是什么?您可以提供一些示例代码吗? - Semafoor
一个包含自己提供者配置的模块与 Terraform v0.13 中引入的 for_each、count 和 depends_on 参数不兼容。您尝试过在 Terraform v0.15.1 中使用它吗? - Nancy Xiong
我正在使用 Terraform v0.15。 - Leonardo Oliveira
2
这是我从 Terraform 团队那里得到的,也许你可以帮我理解为什么会是这样:https://github.com/hashicorp/terraform/issues/28580#issuecomment-831263879 - Leonardo Oliveira
2个回答

2
从错误信息来看,似乎存在提供程序冲突。当使用与父级声明的提供程序不同的提供程序调用模块时,就会发生这种情况。
例如:
.
├── main.tf
├── outputs.tf
├── provider.tf
├── runtime.yaml
└── variables.tf

如果在上述提供者中声明了以下内容:

provider "google" {
  project = var.gcp_project_id
  region  = var.gcp_region
  zone    = var.gcp_zone
}

provider "google-beta" {
  project = var.gcp_project_id
  region  = var.gcp_region
  zone    = var.gcp_zone
}

如果您引用了一个模块,期望是模块引用上面的父级提供程序配置。如果该模块声明了自己的配置并且与上述配置不同,则Terraform将报告错误。

为解决此问题,您应尊重父级提供程序。从模块中删除提供程序声明,然后该依赖项应该兼容。

还请注意,当更新提供程序时 - 您需要执行 terraform init。我删除了预先存在的Terraform隐藏目录,以确保它正确地获取新设置。


1
你可能拥有的代码看起来类似于下面的代码吧?
Root module (eg. terraform.tf):
---

... some code...

module "child_module" {
    count  = var.children_no
    source = "./modules/childmodule.tf"
  ...
}

并且

Child module (childmodule.tf)
---

... some code  ...

provider "any_provider" {
    ...
}

所以...遗憾的是...你不能这样做。如果模块有任何提供者,你就无法“计数”它。:/
这基本上就是错误信息的意思。你要么把提供者从模块中拿出来,要么从根模块中移除count

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接