【问题标题】:Declaring same module twice: duplicate ressources两次声明相同的模块:重复的资源
【发布时间】:2021-10-12 12:04:38
【问题描述】:

我正在开发一个 100% 的 terraform 项目,我正在尝试将一个模块的输出值用于另一个模块。根据不同的 StackOverflow 帖子,将模块 a 的输出导入模块 b 的最流行方法是在模块 b 中引用模块 a,例如:

modules/b/main.tf

module "a" {
  source = "./modules/a"
}

之后,您可以从模块a 中的模块b 访问输出变量。

我的项目结构

├── main.tf # declaring all my modules here
├── modules
│   ├── accounts
│   │   ├── main.tf
│   │   └── variables.tf
│   └── organizations
│       ├── main.tf
│       ├── outputs.tf # the var. that I wanna use in accounts
│       └── variables.tf
├── providers.tf
├── variables.tf
└── versions.tf

所以我的问题是我在 main.tf 中声明我的所有模块

ma​​in.tf

module "organizations" {
  source = "./modules/organizations"
}

module "accounts" {
  source = "./modules/accounts"
}

但是,我需要将模块/组织的一个输出用于模块/帐户。我发现这样做的唯一方法是在我的modules/accounts/main.tf 中拥有(另一个)组织模块

模块/帐户/main.tf

module "organizations" {
  source = "../organizations"
}

resource "aws_organizations_account" "this" {
  name      = "uuuu"
  email     = "udduu@gmail.com"
  parent_id = module.organizations.sandbox_organizational_unit_id #HERE
}

但由于我的main.tf 中已经有一个organizations 模块,它会在我的organization 模块中创建/删除资源两次。

organisations/main.tf

data "aws_organizations_organization" "root" {}

locals {
  root_id = data.aws_organizations_organization.root.roots[0].id
}

resource "aws_organizations_organizational_unit" "sandboxs" {
  name      = var.aws_sandboxs_unit_name
  parent_id = local.root_id
}

organisations/outputs.tf

output "sandbox_organizational_unit_id" {
  value       = aws_organizations_organizational_unit.sandboxs.id
  description = "ID of the Sandboxs OU"
  sensitive   = false
}

【问题讨论】:

  • 您需要在第一个模块中定义outputs,在第二个模块中定义variables 以传递所需的所有信息。
  • 我的第一个模块中已经有了输出,但是如何在第二个模块中使用变量来引用它?
  • module "organizations" { [...] some_variable = module.accounts.some_output }
  • 这正是我目前所拥有的,但由于我也在我的根 main.tf 中声明了相同的模块 organizations,所以我每次申请时都会复制资源
  • 然后把它移到一个地方,不关心组织模块是在哪里创建的,但它应该只声明一次。

标签: terraform


【解决方案1】:

您的任何一个模块都不应明确引用另一个模块。相反,他们应该声明他们期望什么样的变量作为输入(通过variable 键),以及他们提供什么样的输出作为回报(通过output 键)

然后在你的 main.tf 中,你可以把所有东西都放在一起:

module "organizations" {
  source = "./modules/organizations"
  some_variable = module.accounts.some_output
}

module "accounts" {
  source = "./modules/accounts"
}
  • 在“组织”中,some_variable 必须声明为输入:variable some_variable {}
  • accounts 中,some_output 必须声明为输出:output some_output { value = ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多