0Pricing
DevOps Bootcamp · Урок

Циклы с `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 — локальная установка не требуется.

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

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