linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/how/tf-count-vs-for-each

how/resources

count vs for_each: почему удаление одного юзера ломает остальные

Два способа создать N одинаковых ресурсов. Один индексирует по числу, второй - по ключу. Удаление середины массива даёт совершенно разные планы.

count и for_each - два способа создать несколько инстансов одного ресурса. Снаружи они выглядят похоже:

hcl
# count
resource "aws_iam_user" "users" {
  count = length(var.users)
  name  = var.users[count.index]
}
# for_each
resource "aws_iam_user" "users" {
  for_each = toset(var.users)
  name     = each.key
}

Разница спрятана в state. count пишет ресурсы под индексами [0], [1], [2]. for_each - под ключами ["alice"], ["bob"], ["carol"]. Это меняет всё, когда ты удаляешь элемент из середины.

Жми ▶ - посмотрим, как один и тот же var.users с удалённой середины ломает count-вариант и не трогает for_each.

step 1/5·00 · один набор юзеров - два способа
COUNT = LENGTH(VAR.USERS)индексы [0], [1], [2]FOR_EACH = TOSET(VAR.USERS)ключи ["alice"], ["bob"]…variable "users" { default = ["alice","bob","carol"]}resource "aws_iam_user" "users" { count = length(var.users) name = var.users[count.index]}variable "users" { default = ["alice","bob","carol"]}resource "aws_iam_user" "users" { for_each = toset(var.users) name = each.key}один и тот же набор юзеров - двумя способами

§ шаги

  1. Слева - стандартный count с индексом в массиве. Справа - for_each поверх toset(...), потому что for_each хочет коллекцию с уникальными ключами.

    С точки зрения «создать трёх IAM-юзеров» оба варианта эквивалентны. Разница появится позже, когда мы попробуем что-то изменить.

итого

Что важно запомнить:

  • count индексирует по позиции в массиве. Удалил элемент из середины - все элементы после него поехали на одну позицию влево. С точки зрения Terraform это destroy + create для каждого «съехавшего» индекса.
  • for_each индексирует по ключу. Удалил ключ "bob" - Terraform увидел ровно одно изменение: уничтожить users["bob"]. Остальные не тронуты.
  • На AWS-уровне это означает: count пересоздаёт половину IAM-юзеров, а у них могут быть привязанные access-ключи, политики, MFA-токены. Пересоздание = потеря этих привязок.
  • for_each требует, чтобы значения были уникальными (поэтому обычно toset(...)) и известны на этапе plan'a. Если ключ - это uuid() или результат aws_instance.x.id ещё не созданного ресурса, Terraform упадёт с The "for_each" map includes keys derived from resource attributes.
  • Миграция с count на for_each без destroy/create - ровно тот случай, когда нужен moved блок: moved { from = aws_iam_user.users[1] to = aws_iam_user.users["bob"] }. См. tf-moved-block.
  • Правило: используй for_each всегда, кроме случаев, когда тебе действительно нужны числовые индексы (массив без естественных уникальных ключей).

Дальше: tf-resource-lifecycle про управление поведением ресурса на уровне HCL.

§ копнуть в базу знаний

  • tf-count-for-eachcount и for_each в деталях
  • tf-moved-blockmoved-блок: миграция между формами
  • tf-state-manipulationstate mv для аналогичной миграции
  • tf-referencesСсылки на инстансы: [0] vs ["key"]

§ попробовать руками

  • ›tf-beginner-08-count- count на практике
  • ›tf-intermediate-03-module-for-each- for_each на модулях
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки