【问题标题】:Iterate over map of objects in Terraform迭代 Terraform 中的对象地图
【发布时间】:2021-07-27 13:16:23
【问题描述】:

我正在开发下面提供的一个模块,以通过 Terraform 管理 AWS KMS 密钥,我正在使用 flatten 函数,但是当我调用此模块时,我得到的输出是空的。

任何想法为什么我得到空输出?

模块

ma​​in.tf

locals {
  kms_keys = flatten([
    for key, kms_key in var.kms_key_list : [
      for index in range(kms_key.key_id) : {
        key_id                      = index
        aws_kms_alias               = kms_key.alias
        is_rotating                 = kms_key.enable_key_rotation
        deletion_window_in_days     = kms_key.deletion_window_in_days
        is_enabled                  = kms_key.is_enabled
        description                 = kms_key.description
        policy                      = kms_key.policy
      }
    ]
  ])
}

resource "aws_kms_key" "main" {
  for_each = {
    for k, v in local.kms_keys: k => v if v.key_id > 0
  }
  deletion_window_in_days = each.value.deletion_window_in_days
  is_enabled              = each.value.is_enabled
  enable_key_rotation     = each.value.enable_key_rotation
  description             = each.value.description
  policy                  = each.value.policy
  tags = merge({
    Name = each.value.aws_kms_alias
  }, var.common_tags)
}

resource "aws_kms_alias" "alias" {
  for_each      = aws_kms_key.main
  name          = "alias/${each.value.tags.Name}"
  target_key_id = each.value.key_id
}

variables.tf

variable "kms_key_list" {
  type = map(object({
      key_id                    = number
      deletion_window_in_days   = number
      is_enabled                = bool
      enable_key_rotation       = bool
      description               = string
      policy                    = string
      key_usage                 = string
      customer_master_key_spec  = string
      alias                     = string
  }))
}

调用main.tf中的模块

module "kms_keys" {

  source = "../module/kms"

  kms_key_list = local.kms_keys
}

kms_keys.tf

locals {
  kms_keys = {
    name_1 = {
      key_id                    = 1
      deletion_window_in_days   = 7
      is_enabled                = true
      enable_key_rotation       = true
      description               = "description_1"
      policy                    = ""
      key_usage                 = "ENCRYPT_DECRYPT"
      customer_master_key_spec  = "SYMMETRIC_DEFAULT"
      alias                     = "alias_1"
    }
  }
}

TF 计划输出如下所示:

Changes to Outputs:
  + kms_info = {
      + kms_key = {}
    }

【问题讨论】:

  • 你有var.kms_key_list的例子吗?它到底是什么?
  • 是的,如果您检查 variables.tf,您会找到一个示例。对象地图

标签: amazon-web-services terraform amazon-kms


【解决方案1】:

这看起来很奇怪:

for index in range(kms_key.key_id)

这将遍历从 0 到 key_id 值的所有值;这真的是你想要的吗?为从 0 到 key_id 的每个值添加一个条目到 kms_keys

我对此表示怀疑,因为按照您的编码方式,如果您的 var.kms_key_list 包含带有 key_id = 10 的密钥配置,它将创建 10 个不同的 KMS 密钥,所有密钥都具有相同的配置价值观。

基本上,我不明白嵌套 for 循环的目的。

如果您可以提供以下样品:

  1. 输入变量,但带有key_id > 1
  2. 您希望看到的输出

那么我们也许可以提供帮助。 另外,我没有在模块或父文件中看到任何output 声明,所以这些肯定是缺失的;请包括他们。

【讨论】:

  • 嗨@Jordan,key_id 只是意味着 1 - 密钥存在,0 - 密钥已删除。将其更改为 bool、true/false 可能是值得的。模块输出文件:输出“kms_key”{ value = aws_kms_key.main }。调用时的输出文件:``` output "kms_info" { value = module.kms_keys } ```kms_keys.tf中的所有信息
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2021-08-08
  • 2021-06-03
相关资源
最近更新 更多