Учебник Terraform для начинающих
Полный курс по Terraform — самому популярному инструменту инфраструктуры как код (IaC). От идеи «серверы как текст в git» до управления реальным облаком: язык HCL, ресурсы и граф зависимостей, переменные и выводы, центральная тема state, модули и переиспользование, провайдеры и боевой workflow с CI/CD.
Каждый урок — 700+ слов с ASCII-диаграммами и запускаемыми Python-врезками, которые показывают логику Terraform изнутри: как строится план, граф зависимостей и diff состояний. Курс одинаково применим к Terraform и открытому форку OpenTofu.
Курс «Terraform: инфраструктура как код» состоит из 6 разделов и 23 уроков: Что такое IaC и Terraform, HCL-синтаксис и ресурсы, Переменные, выводы и data-источники, State и его управление, Модули и переиспользование и Практика: провайдеры и workflow. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Что такое IaC и Terraform
- Что такое инфраструктура как код
IaC: зачем описывать серверы и сети кодом вместо кликов в консоли. Декларативный и императивный подход, идемпотентность.
- Знакомство с Terraform и OpenTofu
Что такое Terraform, кто его создал, лицензия BSL и форк OpenTofu (MPL 2.0). Провайдер-агностичность и место среди IaC-инструментов.
- Первый цикл: write, plan, apply, destroy
Базовый рабочий цикл Terraform: init, plan, apply, destroy. Что делает каждая команда и почему plan нужно читать перед apply.
- Что такое инфраструктура как код
2 HCL-синтаксис и ресурсы
- Язык HCL: блоки, аргументы, выражения
Синтаксис HCL: блоки и аргументы, типы данных, выражения и интерполяция ${}. Комментарии и базовая структура .tf-файла.
- Ресурсы: главный строительный блок
Блок resource: тип, имя, аргументы. Жизненный цикл CRUD, атрибуты ресурса и ссылки между ресурсами через адреса.
- Граф зависимостей и порядок выполнения
Как Terraform строит DAG ресурсов, неявные и явные зависимости (depends_on), параллелизм и почему граф ацикличен.
- count и for_each: множественные ресурсы
Создание множества ресурсов: meta-аргументы count и for_each, их отличия, индексы и ключи, почему for_each стабильнее.
- Функции, выражения и условная логика
Встроенные функции HCL, тернарный оператор, splat-выражения, циклы for, dynamic-блоки. Выразительные конструкции языка.
- Язык HCL: блоки, аргументы, выражения
3 Переменные, выводы и data-источники
- Входные переменные: variable и валидация
Блок variable: типы, default, описание, sensitive. Способы передачи значений и валидация через validation-блок.
- Передача значений: tfvars и приоритеты
Способы задать значения переменных: -var, файлы tfvars и auto.tfvars, переменные окружения TF_VAR_. Порядок приоритетов.
- Выходные значения: output
Блок output: возврат вычисленных атрибутов, sensitive-выводы, использование выводов между конфигурациями и в модулях.
- Data-источники: чтение существующего
Блок data: read-only доступ к существующим ресурсам и внешним данным. Отличие от resource, фильтры, типичные сценарии.
- Входные переменные: variable и валидация
4 State и его управление
- Что такое state и зачем он нужен
Terraform state: карта между кодом и реальностью. Зачем хранить состояние, что внутри tfstate, desired vs current state.
- Удалённый бэкенд и блокировки
Remote backend (S3, Terraform Cloud): где хранить state в команде. State locking против конфликтов, нативный S3 lock.
- Дрифт, refresh и обнаружение расхождений
Configuration drift: когда реальность разошлась со state. Команды plan -refresh-only и apply -refresh-only, deprecated refresh.
- Операции над state: import, move, rm
Команды terraform state и import: импорт существующих ресурсов, перемещение в state (moved-блок), удаление из state без destroy.
- Что такое state и зачем он нужен
5 Модули и переиспользование
- Модули: переиспользование конфигурации
Что такое модуль Terraform: контейнер ресурсов с входами и выходами. Root-модуль и child-модули, блок module, инкапсуляция.
- Источники и версионирование модулей
Source модуля: локальный путь, Git, Terraform Registry. Версионирование через version и теги, public и private registry.
- Композиция: вложенные модули и среды
Композиция модулей: слоистая архитектура, передача выходов между модулями, паттерн на окружения, запрет циклов.
- Модули: переиспользование конфигурации
6 Практика: провайдеры и workflow
- Провайдеры: настройка и версии
Блок provider и required_providers: настройка аутентификации, регионов, алиасы провайдеров, фиксация версий и lock-файл.
- Организация проекта и окружения
Структура Terraform-проекта: разделение на окружения, отдельные state, workspaces против папок, файлы main/variables/outputs.
- CI/CD и автоматизация Terraform
Terraform в CI/CD: plan на pull request, apply при merge, защита прода, хранение плана, secrets и блокировки в пайплайне.
- Безопасность, зрелость и куда расти
Безопасность Terraform: секреты, защита state, политики и сканеры (tfsec, OPA), модель зрелости и дальнейшие шаги.
- Провайдеры: настройка и версии