Динамические блоки для вложенной конфигурации
Программно создавайте повторяющиеся вложенные блоки конфигурации с помощью динамических блоков, избавляясь от копирования и вставки, например при настройке правил групп безопасности.
«Динамические блоки для вложенной конфигурации» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Циклы с `for_each` и `count`
- Встроенные функции Terraform
- Условные выражения и splat-выражения
- Динамические блоки для вложенной конфигурации