将值添加到 Terraform 中的深层嵌套地图

Add values to deep nested map in Terraform

我正在使用 AWS EKS module 18.20.5 并尝试将值添加到深度嵌套的地图中。地图是

variable "eks_managed_node_groups" {
  description = "Map of managed node group definitions to create"
  type        = any
  default     = {
    management_cluster_on_demand = {
      desired_capacity = 3
      max_capacity     = 10
      min_capacity     = 3

      instance_types = ["c5.2xlarge"]
      capacity_type  = "ON_DEMAND"
      k8s_labels = {
        Environment  = "testing"
        GithubRepo   = "infrastructure-modules-kubernetes-cluster"
        GithubSource = "terraform-aws-modules"
      }
      additional_tags = {
        cluster = "management_cluster_new"
      }

      block_device_mappings = {
        xvda = {
          device_name = "/dev/xvda"
          ebs = {
            volume_size           = 50
            volume_type           = "gp2"
            delete_on_termination = true
          }
        }
      }
    }
  }
}

我的目标是在 ebs 部分添加一些额外的值,特别是

encrypted = true
kms_key_id = module.kms.arn

这将强制添加到节点组的任何卷使用 KMS 密钥加密其 EBS 卷。

我试过使用 locals 添加值,但问题是当我到达 xbda 部分时,它试图循环遍历字符串但失败了

locals {
  managed_nodes = flatten([
    for group in var.eks_managed_node_groups: [
      for vol in group.block_device_mappings: [
        for settings in vol: [
          for values in settings: values
        ]
      ]
    ]
  ])
}

当 运行 Terraform 计划时,会导致以下错误

│ Error: Iteration over non-iterable value
│ 
│   on main.tf line 9, in locals:
│    8:         for settings in vol: [
│    9:           for values in settings: values
│   10:         ]
│ 
│ A value of type string cannot be used as the collection in a 'for' expression.

这有可能实现吗? 谢谢。

我认为以下内容应该可以完成工作:

locals {
    eks_managed_node_groups = {
        for group_name, group in var.eks_managed_node_groups: 
          group_name => merge(group, {block_device_mappings = {
                for device_name, device in group.block_device_mappings: 
                    device_name => merge(device, 
                             {ebs=merge(device.ebs, {
                                    encrypted = true
                                    kms_key_id = "module.kms.arn"
                                })})
                }})

            }
}

导致:

{
  "management_cluster_on_demand" = {
    "additional_tags" = {
      "cluster" = "management_cluster_new"
    }
    "block_device_mappings" = {
      "xvda" = {
        "device_name" = "/dev/xvda"
        "ebs" = {
          "delete_on_termination" = true
          "encrypted" = true
          "kms_key_id" = "module.kms.arn"
          "volume_size" = 50
          "volume_type" = "gp2"
        }
      }
    }
    "capacity_type" = "ON_DEMAND"
    "desired_capacity" = 3
    "instance_types" = [
      "c5.2xlarge",
    ]
    "k8s_labels" = {
      "Environment" = "testing"
      "GithubRepo" = "infrastructure-modules-kubernetes-cluster"
      "GithubSource" = "terraform-aws-modules"
    }
    "max_capacity" = 10
    "min_capacity" = 3
  }
}

我没有你的 module.kms.arn,所以我只是将它用作字符串 "module.kms.arn"。所以你必须把它改回 module.kms.arn.