Динамический блок для дополнительных элементов

#terraform

Вопрос:

У меня есть динамический блок для переменной.

   dynamic "settings" {
    for_each = var.settings
    content {
      id      = lookup(settings.value, "id", null)
      ...
    }
  }
 

Но из вызывающего модуля не обязательно, settings чтобы он всегда существовал, и когда-нибудь он просто будет передан null .

 settings = null
 

Однако, когда это происходит, я начинаю следить за ходом планирования.

 var.settings is null
Cannot use a null value in for_each.
 

Так что, в принципе, я хочу только динамическую генерацию блоков, когда settings этого нет null . Как лучше всего я могу решить эту проблему?

Ответ №1:

В этой ситуации обычно не требуется назначать list map переменную типа или null для обозначения неопределенного значения. Вместо этого вы хотели бы использовать пустые конструкторы [] для list и {} для map . Это даст вам желаемое поведение и будет способствовать чистоте кода.

Если вы действительно хотите назначить null не string или number типу, то вы можете использовать функцию объединения с шаблоном объединения null (некоторые языки предоставляют для этого операторы; например ?: , в JS):

 for_each = coalesce(var.settings, [])
 

и это даст вам то поведение, которого вы желаете. Обратите внимание, что он в основном добавляет еще один слой для использования пустого конструктора в качестве резервной копии/по умолчанию, что является образцом лучших практик, рекомендованным в начале ответа.