Инфраструктура не кликами в консоли, а кодом: описал в файле — получил тот же сервер и в первый, и в сотый раз
Terraform — инструмент «инфраструктура как код» (IaC, Infrastructure as Code) от HashiCorp: ты декларативно описываешь нужную инфраструктуру (серверы, сети, базы, DNS) в текстовых файлах, а Terraform создаёт и поддерживает её, обращаясь к API облаков. Один язык (HCL) — под любое облако: AWS, GCP, Azure, Yandex Cloud, а также Docker и Kubernetes.
Поднять сервер кликами в веб-консоли облака быстро, но:
- не воспроизводимо — через месяц никто не вспомнит точные настройки;
- нет истории и ревью — кто, что и зачем менял;
- дрейф — прод и staging расходятся, «у меня работает».
IaC решает это: инфраструктура описана файлом под гитом — её можно ревьюить, версионировать, воссоздать одной командой и держать одинаковой везде.
- Провайдер (provider) — плагин под конкретную платформу (AWS, Yandex Cloud, Docker…). Он знает, какие ресурсы бывают и как их создавать через API.
- Ресурс (resource) — единица инфраструктуры: виртуалка, сеть, база, DNS-запись, бакет.
- Состояние (state) — файл
terraform.tfstate: карта «что описано в коде → что реально создано». По нему Terraform понимает, что менять. Ключевой и опасный элемент (см. ловушки).
Ты описываешь желаемый конечный вид, а Terraform сам вычисляет разницу с текущим состоянием и приводит к нему (как Kubernetes, только для инфраструктуры, а не контейнеров).
terraform {
required_providers {
yandex = { source = "yandex-cloud/yandex" }
}
}
resource "yandex_compute_instance" "web" {
name = "web-1"
zone = "ru-central1-a"
resources {
cores = 2
memory = 4
}
# ...
}terraform init # скачать провайдеры, подготовить рабочую папку
terraform plan # ПОКАЗАТЬ, что будет создано/изменено/удалено — без применения
terraform apply # применить изменения (создать/поменять инфраструктуру)
terraform destroy # снести всё, что создано этим конфигом
plan— главная страховка. Он показывает точный diff (+создать,~изменить,-удалить) до того, как что-то произойдёт. Всегда смотриplanпередapply, особенно на проде — заметишь случайноеdestroy.
- Идемпотентность. Повторный
applyбез изменений в коде ничего не делает — Terraform приводит реальность к описанию и удерживает. Изменил код → применяется только разница. - Иммутабельность. Часто ресурс проще пересоздать, чем менять на месте (сменил образ ВМ → Terraform удалит старую и создаст новую).
- Модули (modules) — переиспользуемые пакеты конфигурации (например, «типовой сервис»), с входными переменными и выходами.
- Переменные и outputs — параметризация конфигурации и передача значений (IP, id) наружу.
- Удалённое состояние. В команде
tfstateхранят не локально, а в общем бэкенде (S3, Terraform Cloud) с блокировкой — чтобы двое не применяли одновременно.
Их часто путают — но это разные слои:
| Terraform | Ansible | |
|---|---|---|
| Задача | создать инфраструктуру (provisioning) | настроить ПО на существующих серверах (configuration) |
| Стиль | декларативный (желаемое состояние) | преимущественно процедурный (шаги) |
| Пример | поднять 3 ВМ и сеть | поставить nginx и выкатить конфиг на эти ВМ |
Часто их сочетают: Terraform поднимает серверы → Ansible их настраивает.
Ручные правки в обход Terraform. Поменял ресурс кликами в консоли — возник дрейф: реальность разошлась с state. Следующий apply попытается «вернуть как в коде» и может сломать. Правило: всё — только через Terraform.
Потеря/порча tfstate. Без state Terraform «забывает», что создавал, и может задублировать ресурсы. Держи state в удалённом бэкенде с блокировкой и бэкапами, не коммить локальный tfstate в гит.
Секреты в state. Пароли и ключи попадают в tfstate открытым текстом — храни state в защищённом бэкенде, не в публичном репозитории (Веб-безопасность).
Лицензия. С 2023 Terraform перешёл на лицензию BSL (не полностью открытая); полностью open-source форк — OpenTofu (совместим по командам и HCL).
- Kubernetes — оркестрация контейнеров; Terraform часто поднимает сам кластер, k8s управляет подами внутри;
- Docker — Terraform умеет и Docker-провайдером, но обычно оперирует уровнем облака/ВМ;
- CI CD —
terraform plan/applyвстраивают в пайплайн (инфраструктура выкатывается автоматически); - Развертывание проекта — Terraform готовит серверы, на которые катится приложение;
- Веб-безопасность — секреты в state; хранение и доступ;
- конфиги — HCL как язык описания (рядом с YAML/JSON).