Добавьте значения в карту глубокой вложенности в Terraform

Я использую Модуль AWS EKS 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

Это заставит любые тома, добавленные в группу узлов, зашифровать свой том EBS с помощью ключа KMS.

Я пытался использовать местные жители для добавления значений, но проблема в том, что когда я добираюсь до раздела 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.

Это вообще возможно выполнить? Спасибо.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что следующее должно выполнить эту работу:

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.

Другие вопросы по теме