创建一组资源,也通过模块,在Terraform中使用for_?

创建一组资源,也通过模块,在Terraform中使用for_?,terraform,Terraform,我有一组我想在Terraform中创建的资源,一些是使用resource本地创建的,另一些是通过调用module创建的。我需要几套那样的一套看起来像 module "my_secret_one" { source = "rhythmictech/secretsmanager-random-secret/aws" version = "1.2.0" length = 16 name

我有一组我想在Terraform中创建的资源,一些是使用
resource
本地创建的,另一些是通过调用
module
创建的。我需要几套那样的一套看起来像

module "my_secret_one" {
 
  source      = "rhythmictech/secretsmanager-random-secret/aws"
  version     = "1.2.0"
  length      = 16
  name        = "my_secret_one"
  description = "..."

}

resource "postgresql_role" "my_secret_one_role" {
  name     = "my_secret_one"
  login    = true
  password = module.my_secret_one.secret
}

// and few other resources also dependent on "my_secret_one".

现在,我实际上有几个秘密,
我的秘密一个,我的秘密二个,我的秘密三个…


我如何在terraform中声明为所有这些创建所有模块和资源,使用
for_each

这里的第一步是定义一个描述要创建的对象的集合。在您的案例中,似乎只有名称和描述在不同的机密中有所不同,因此这可能是定义这些机密的变量的一个很好的候选:

variable "secrets" {
  type = map(object({
    description = string
  }))
}
(如果您只打算在模块内部使用此选项,那么您也可以使用局部值而不是输入变量,但生成对象映射的原则仍然相同。)

然后,您可以将该映射用作模块的每个的
,将模块用作Postgres角色的每个
,以便Terraform可以查看这些对象之间的关系:

module "secret" {
  source   = "rhythmictech/secretsmanager-random-secret/aws"
  version  = "1.2.0"
  for_each = var.secrets

  name        = each.key
  description = each.value.description
  length      = 16
}

resource "postgresql_role" "secret" {
  for_each = module.secret

  login    = true
  password = each.value.secret # each.value here is an instance of module.secret
}

关于使用Terraform管理机密的常见警告适用于此:请注意,Terraform需要跟踪机密值作为状态快照的一部分,因此您应该确保此配置的状态快照存储在足够安全的位置。有关更多信息,请参阅Terraform文档中的。

这里的第一步是定义一个描述要创建的对象的集合。在您的案例中,似乎只有名称和描述在不同的机密中有所不同,因此这可能是定义这些机密的变量的一个很好的候选:

variable "secrets" {
  type = map(object({
    description = string
  }))
}
(如果您只打算在模块内部使用此选项,那么您也可以使用局部值而不是输入变量,但生成对象映射的原则仍然相同。)

然后,您可以将该映射用作模块的每个
,将模块用作Postgres角色的每个
,以便Terraform可以查看这些对象之间的关系:

module "secret" {
  source   = "rhythmictech/secretsmanager-random-secret/aws"
  version  = "1.2.0"
  for_each = var.secrets

  name        = each.key
  description = each.value.description
  length      = 16
}

resource "postgresql_role" "secret" {
  for_each = module.secret

  login    = true
  password = each.value.secret # each.value here is an instance of module.secret
}

关于使用Terraform管理机密的常见警告适用于此:请注意,Terraform需要跟踪机密值作为状态快照的一部分,因此您应该确保此配置的状态快照存储在足够安全的位置。有关更多信息,请参阅Terraform文档中的。

Terraform>=0.13?Terraform>=0.13?