how/resources
Два способа создать N одинаковых ресурсов. Один индексирует по числу, второй - по ключу. Удаление середины массива даёт совершенно разные планы.
count и for_each - два способа создать несколько инстансов
одного ресурса. Снаружи они выглядят похоже:
# 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.
Слева - стандартный count с индексом в массиве. Справа -
for_each поверх toset(...), потому что for_each хочет
коллекцию с уникальными ключами.
С точки зрения «создать трёх IAM-юзеров» оба варианта эквивалентны. Разница появится позже, когда мы попробуем что-то изменить.
итого
Что важно запомнить:
count индексирует по позиции в массиве. Удалил элемент
из середины - все элементы после него поехали на одну позицию
влево. С точки зрения Terraform это destroy + create для
каждого «съехавшего» индекса.for_each индексирует по ключу. Удалил ключ "bob" -
Terraform увидел ровно одно изменение: уничтожить
users["bob"]. Остальные не тронуты.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.