Terraform Infrastructure as Code · Урок

Динамические блоки для вложенной конфигурации

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

Урок 4 из 413 шагов

«Динамические блоки для вложенной конфигурации» — бесплатный урок Terraform Infrastructure as Code на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Terraform Infrastructure as Code, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Terraform Infrastructure as Code содержит 4 уроков всего.

Проблема повторения

Некоторые ресурсы содержат повторяющиеся вложенные блоки, например несколько правил ingress в группе безопасности. Записывать каждое правило вручную многословно и сложно поддерживать принцип DRY. Динамические блоки создают их из коллекции.

Сначала статические блоки

Вот ручной вариант: три почти одинаковых блока ingress. Представьте, что Вам нужно поддерживать дюжину таких блоков.

resource "aws_security_group" "web" {
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Структура динамического блока

Блок dynamic содержит метку, совпадающую с именем вложенного блока, коллекцию for_each и блок content, описывающий каждый создаваемый экземпляр.

dynamic "ingress" {
  for_each = var.rules
  content {
    from_port   = ingress.value.port
    to_port     = ingress.value.port
    protocol    = "tcp"
    cidr_blocks = ingress.value.cidrs
  }
}

Объект итератора

Внутри content обращайтесь к текущему элементу через объект, названный так же, как метка блока. Он предоставляет .value (элемент) и .key (ключ карты или индекс списка).

Определение входной переменной

Управляйте динамическим блоком с помощью типизированной переменной. Список объектов позволяет документировать каждое правило непосредственно в его структуре.

variable "rules" {
  type = list(object({
    port  = number
    cidrs = list(string)
  }))
}

Собираем всё вместе

Теперь ресурс остаётся компактным независимо от количества переданных правил.

resource "aws_security_group" "web" {
  name = "web-sg"
  dynamic "ingress" {
    for_each = var.rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = ingress.value.cidrs
    }
  }
}

Переименование итератора

Аргумент iterator позволяет переименовать переменную итерации. Это особенно полезно при вложении динамических блоков, чтобы избежать путаницы.

dynamic "ingress" {
  for_each = var.rules
  iterator = rule
  content {
    from_port = rule.value.port
    to_port   = rule.value.port
  }
}

Условный пропуск блоков

Передайте пустую коллекцию, чтобы создать ноль блоков. Тернарное выражение для for_each делает блок необязательным.

dynamic "logging" {
  for_each = var.enable_logging ? [1] : []
  content {
    target_bucket = var.log_bucket
  }
}

Вложенные динамические блоки

Динамические блоки можно вкладывать друг в друга. Используйте разные итераторы, чтобы внутренний блок мог обращаться к обоим уровням без неоднозначности.

dynamic "setting" {
  for_each = var.settings
  iterator = s
  content {
    namespace = s.value.namespace
    name      = s.value.name
    value     = s.value.value
  }
}

Когда не следует использовать динамические блоки

Динамические блоки добавляют косвенность и могут ухудшить читаемость. Если у Вас всего один или два статических блока, оставьте их в явном виде. Используйте динамические блоки, когда их количество определяется данными.

Проверка результата

Выполните планирование, чтобы убедиться, что созданные блоки соответствуют ожиданиям. Terraform преобразует каждый элемент коллекции в конкретный вложенный блок.

terraform plan

Быстрая проверка

Проверьте свои знания о динамических блоках.

Итоги: конфигурация вложенных блоков по принципу DRY

Динамические блоки позволяют создавать вложенную конфигурацию на основе данных:

  • for_each управляет итерацией, а content определяет каждый блок.
  • Итератор предоставляет .value и .key.
  • Пустые коллекции делают блоки необязательными.
  • Используйте их умеренно, чтобы конфигурации оставались читаемыми.
Можно начать бесплатно

Изучай Terraform Infrastructure as Code с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
12
Уроки
48

Часто задаваемые вопросы

Урок «Динамические блоки для вложенной конфигурации» бесплатный?

Да — полный текст урока «Динамические блоки для вложенной конфигурации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Terraform Infrastructure as Code, подпишись на CoddyKit PRO. Курс Terraform Infrastructure as Code содержит 4 уроков всего.

Чему я научусь в уроке «Динамические блоки для вложенной конфигурации»?

Программно создавайте повторяющиеся вложенные блоки конфигурации с помощью динамических блоков, избавляясь от копирования и вставки, например при настройке правил групп безопасности. Ты практикуешь Terraform Infrastructure as Code с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Terraform Infrastructure as Code?

Предыдущий опыт не требуется. Terraform Infrastructure as Code на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Динамические блоки для вложенной конфигурации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Terraform Infrastructure as Code?

Да. Каждый урок Terraform Infrastructure as Code включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Циклы с `for_each` и `count`
  2. Встроенные функции Terraform
  3. Условные выражения и splat-выражения
  4. Динамические блоки для вложенной конфигурации
← Назад к Terraform Infrastructure as Code