在 Terraform 中,如何在包含的模块中引用根模块中创建的组件

Posted

技术标签:

【中文标题】在 Terraform 中,如何在包含的模块中引用根模块中创建的组件【英文标题】:In Terraform , how to refer to components created in root module in included modules 【发布时间】:2020-11-25 17:16:38 【问题描述】:

下面的例子是为了给出一个关于这个问题的想法。

我在 Terraform 脚本的根模块中创建了一个资源组和 EventHubNS

我有另一个模块,称为 processingmodule ,它具有功能、EventHub 和其他一些聚合组件。

所以根模块如下 - 创建 Azure 资源组 创建 EventHubNS 创建处理模块

如果事件中心是在根模块中创建的,则使用下面的资源块创建 eventhub 资源

resource "azurerm_eventhub" "eventhub" 
  name                = "$var.eventhubname-eh"
  namespace_name      = azurerm_eventhub_namespace.eventhubns.name
  resource_group_name = azurerm_resource_group.RG.name
  partition_count     = var.eventhub_partitioncount
  message_retention   = 5
 

如果我写模块,namespace_name和resource_group_name不能引用,如下所示

namespace_name      = azurerm_eventhub_namespace.eventhubns.name
resource_group_name = azurerm_resource_group.RG.name

相反,namespace_name 应该通过变量来引用。

namespace_name      = var.eventhubnsname
resource_group_name = var.resourcegroupname

所以问题是 - 无论如何都可以从 processingcomponent 模块引用根模块中创建的资源

【问题讨论】:

能否提供完整的sn-p代码? 【参考方案1】:

模块无权访问父级中的资源,除非这些资源作为变量传递给模块。

【讨论】:

这意味着我必须使用变量?有没有办法通过数据等其他机制提取名称? 变量是执行此操作的方法。如果您尝试通过在父模块中创建的子模块中的数据引用某些内容,您将收到 Terraform 计划错误,因为您尝试在模块中查找的数据在计划时尚未由父模块创建已生成。

以上是关于在 Terraform 中,如何在包含的模块中引用根模块中创建的组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hashicorp Terraform 中配置环境变量

您如何在应用程序代码中引用动态 terraform 输出?

如何在 terraform 路由表中引用 AWS 本地前缀列表?

如何安装多个或两个版本的 Terraform?

如何将数据源从一个模块引用到另一个模块并将其作为变量传递给根模块?

如何使用 terraform 在多个区域进行设置?