使用 for_each 在 Terraform 中创建资源集,也通过模块?

时间:2021-02-16 14:46:04

标签: terraform

我有一组要在 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".

现在,我实际上有几个秘密,my_secret_one, my_secret_two, my_secret_three...

如何使用 for_each 在 terraform 中声明所有模块和资源的创建?

1 个答案:

答案 0 :(得分:2)

您在这里的第一步是定义一个集合来描述您要创建的对象。在您的情况下,看起来只有名称和描述会因秘密而异,所以也许这是定义这些变量的一个很好的候选者:

variable "secrets" {
  type = map(object({
    description = string
  }))
}

(如果您只想在模块内部使用它,那么您也可以使用本地值而不是输入变量,但无论哪种方式,制作对象映射的原则都保持不变。)

然后,您可以将该映射用作模块的 for_each,并将该模块用作 Postgres 角色的 for_each,以便 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 文档中的 State: Sensitive Data