kb/resources
Resource-блок описывает что создать, data-блок, что прочитать. Lifecycle (create_before_destroy, prevent_destroy, ignore_changes), depends_on, count vs for_each, всё это инструменты для контроля как terraform управляет жизненным циклом инфры.
count создаёт N одинаковых ресурсов по индексам 0..N-1. for_each: ресурсы по ключам из set или map. Правило: count для одинаковых, for_each когда у каждого свои настройки. Если сомневаешься, бери for_each.
data, это блок, который запрашивает существующую инфру и отдаёт её атрибуты в HCL. Terraform ничего не создаёт; он только читает. Используется чтобы привязаться к ресурсам, которые сделаны не Terraform'ом или живут в другом проекте.
Блок lifecycle настраивает четыре поведения: create_before_destroy (zero-downtime), prevent_destroy (защита от удаления), ignore_changes (игнор drift по атрибутам), replace_triggered_by (пересоздать по сигналу).
resource, это блок, который говорит Terraform «создай мне такую штуку в облаке». У него три части: тип ресурса (что это), имя (как зовём внутри), и аргументы (как настроить). 90% времени в Terraform, это написание таких блоков.
Terraform автоматически вычисляет порядок создания ресурсов из ссылок в HCL (неявные зависимости). Когда такой ссылки нет, но порядок важен: есть depends_on. Использовать редко: чаще это сигнал что архитектура спорная.