Циклы с `for_each` и `count`
Научитесь создавать несколько экземпляров ресурса или модуля с помощью `count` и `for_each`, эффективно работая с коллекциями и отображениями.
«Циклы с `for_each` и `count`» — бесплатный урок Terraform Infrastructure as Code на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Terraform Infrastructure as Code, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Terraform Infrastructure as Code содержит 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) и разблокировать остальной курс Terraform Infrastructure as Code, подпишись на CoddyKit PRO. Курс Terraform Infrastructure as Code содержит 4 уроков всего.
Чему я научусь в уроке «Циклы с `for_each` и `count`»?
Научитесь создавать несколько экземпляров ресурса или модуля с помощью `count` и `for_each`, эффективно работая с коллекциями и отображениями. Ты практикуешь Terraform Infrastructure as Code с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Terraform Infrastructure as Code?
Предыдущий опыт не требуется. Terraform Infrastructure as Code на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Циклы с `for_each` и `count`»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Terraform Infrastructure as Code?
Да. Каждый урок Terraform Infrastructure as Code включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Циклы с `for_each` и `count`
- Встроенные функции Terraform
- Условные выражения и splat-выражения
- Динамические блоки для вложенной конфигурации