#count-vs-for-each
В чём разница `count` и `for_each`? Что выбрать в новом коде?
Что отвечать
`count = N` создаёт N идентичных ресурсов с адресами `r[0]`, `r[1]`, `r[2]`. `for_each = set/map` создаёт по элементу с адресом `r["alpha"]`, `r["beta"]`. Главная разница в state. Удалишь элемент из середины count - все следующие переедут на индекс ниже и пересоздадутся. С for_each по map - удалишь ключ, удалится только тот ресурс. В новом коде - почти всегда `for_each`. Count оставляют для случаев «N однотипных без идентичности» (буквы алфавита, индексы массива).
Что хотят услышать
Кандидат должен: - объяснить почему for_each надёжнее по reindex'у: stable keys вместо позиционных - назвать что for_each требует set(string) или map; список нужно обернуть в `toset(list)` - сказать что ключи for_each должны быть known at plan time - нельзя `for_each = aws_subnet.x[*].id`, можно `for_each = var.subnets` - различить `each.key` и `each.value` для map: ключ + значение; для set - оба равны элементу - упомянуть `for_each = { for k, v in var.users : k => v if v.enabled }` как идиоматичный фильтр
Подводные камни
- ✗ Использовать count с динамической длиной списка - удаление элемента из середины пересоздаст хвост
- ✗ Передать в for_each список через `for_each = var.list` - ошибка типа, нужен `toset(var.list)` или map
- ✗ Сделать for_each по computed-значению (`aws_subnet.x[*].id`) - plan упадёт «cannot use unknown value»
Follow-up
- ? Что произойдёт при удалении 5-го элемента из списка в `count`?
- ? Как сделать map-based for_each по computed-значениям?
- ? Когда `count` всё-таки разумнее чем `for_each`?
Глубина в базе знаний