Циклы с `for_each` и `count`
Научитесь создавать несколько экземпляров ресурса или модуля с помощью `count` и `for_each`, эффективно работая с коллекциями и отображениями.
«Циклы с `for_each` и `count`» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Введение в циклы
При управлении инфраструктурой с помощью Terraform часто требуется создавать несколько похожих ресурсов. Представьте, что Вам нужно 10 веб-серверов или 5 экземпляров базы данных. Многократное написание одного и того же блока кода было бы утомительным и приводило бы к ошибкам!
В этом уроке представлены две мощные возможности Terraform: count и for_each. Они помогают эффективно подготавливать несколько ресурсов, сохраняя конфигурации чистыми и масштабируемыми.
Зачем использовать `count` и `for_each`?
Использование циклов, таких как count и for_each, даёт значительные преимущества:
- Меньше дублирования: напишите код инфраструктуры один раз и используйте его повторно.
- Улучшенная читаемость: Ваши конфигурации станут намного чище и понятнее.
- Масштабируемость: легко изменяйте количество ресурсов, меняя одно значение или коллекцию.
- Согласованность: обеспечьте одинаковую настройку всех похожих ресурсов.
`count` для простого повторения
Метааргумент count идеально подходит, когда необходимо создать несколько почти идентичных экземпляров ресурса или модуля. Вы указываете целое число, а Terraform создаёт соответствующее количество экземпляров.
Каждому экземпляру, созданному с помощью count, назначается индекс: от 0 до count - 1. Получить этот индекс можно через count.index.
Пример: несколько экземпляров EC2 с помощью `count`
Давайте подготовим три одинаковых экземпляра AWS EC2. Обратите внимание, как count.index используется для присвоения каждому серверу уникального имени.
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
count = 3
ami = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
instance_type = "t2.micro"
tags = {
Name = "WebServer-${count.index}"
}
}Разбор `count.index`
В предыдущем примере выражение ${count.index} автоматически принимает значения 0, 1 и 2 для каждого экземпляра. Это позволяет создавать уникальные идентификаторы или изменять свойства каждого экземпляра.
Без count.index все три сервера имели бы совершенно одинаковую метку «Name», что могло бы привести к путанице или проблемам в AWS.
Знакомство с `for_each`
Хотя count отлично подходит для простого повторения, for_each обеспечивает большую гибкость. Он перебирает множество строк или карту строк, создавая по одному экземпляру для каждого элемента.
for_each идеально подходит, когда необходимо управлять ресурсами с различающимися конфигурациями или когда количество ресурсов определяется нечисловой коллекцией (например, списком имён окружений или картой пользовательских настроек).
Пример: `for_each` с множеством
Здесь мы создаём три хранилища S3, каждое из которых получает имя соответствующего элемента множества for_each. Для доступа к текущему элементу в цикле мы используем each.value.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "app_buckets" {
for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
bucket = each.value
acl = "private"
tags = {
Environment = split("-", each.value)[0]
}
}Пример: `for_each` с картой
Карта позволяет определить более сложные уникальные конфигурации для каждого ресурса. Здесь мы создаём хранилища S3 с разными настройками версионирования, основанными на ключах окружений.
Получить ключ можно через each.key, а значение — через each.value.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "configured_bucket" {
for_each = {
production = { name = "prod-data-bucket", versioning = true }
development = { name = "dev-logs-bucket", versioning = false }
}
bucket = each.value.name
acl = "private"
versioning {
enabled = each.value.versioning
}
tags = {
Environment = each.key
}
}`count` и `for_each`: правильный выбор
Когда следует использовать каждый из них?
- Используйте
count: для простого числового перебора и создания одинаковых ресурсов, когда главным является их количество. Это хороший выбор, если для различения нужен только индекс. - Используйте
for_each: для перебора сложных коллекций (множеств или карт), когда ресурсам нужны уникальные идентификаторы или свойства, получаемые из элементов коллекции. Обычно этот вариант предпочтительнее, если у каждого экземпляра есть понятный уникальный логический идентификатор.
Быстрая проверка: циклы
Рассмотрите ситуацию: Вам нужно создать хранилище S3 для каждой команды в организации, причём для каждого хранилища должна быть задана определённая этой командой политика хранения.
Итоги: эффективное создание ресурсов
Отличная работа! Вы научились использовать count и for_each, чтобы сделать конфигурации Terraform более динамичными и эффективными.
countпредназначен для простого числового повторения одинаковых ресурсов с использованиемcount.indexдля их различения.for_eachпредназначен для перебора множеств или карт и создания отдельных ресурсов с уникальными свойствами с помощьюeach.keyиeach.value.
Эти конструкции необходимы для управления масштабируемой и удобной в сопровождении инфраструктурой как кодом!
Часто задаваемые вопросы
Урок «Циклы с `for_each` и `count`» бесплатный?
Да — полный текст урока «Циклы с `for_each` и `count`» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Циклы с `for_each` и `count`»?
Научитесь создавать несколько экземпляров ресурса или модуля с помощью `count` и `for_each`, эффективно работая с коллекциями и отображениями. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Циклы с `for_each` и `count`»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Циклы с `for_each` и `count`
- Встроенные функции Terraform
- Условные выражения и splat-выражения
- Динамические блоки для вложенной конфигурации