迭代 Terraform 中的对象地图

问题描述

我正在开发下面提供的模块,以通过 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 = {}
    }

解决方法

这看起来很奇怪:

for index in range(kms_key.key_id)

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

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

基本上,我不理解嵌套 for 循环的目的。

如果您能提供以下样品:

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

那么我们也许可以提供帮助。 另外,我在模块或父文件中都没有看到任何 output 声明,因此必须缺少这些;请包括他们。