Что такое Terraform: провайдеры, ресурсы и цикл plan/apply
Основы4 минРедакция Innovialabs
Коротко
Terraform — инструмент Infrastructure as Code: вы описываете нужную инфраструктуру в файлах HCL, а он сам сравнивает её с реальностью и создаёт, меняет или удаляет ресурсы через API облака.
Что такое Terraform простыми словами
Terraform — это инструмент для подхода Infrastructure as Code (IaC). Вместо того чтобы вручную кликать в панели облака, вы пишете текстовый файл: «нужен сервер такого размера, в такой сети, с таким firewall». Terraform читает файл, сравнивает с тем, что уже существует, и приводит инфраструктуру к описанному состоянию.
Главная идея — декларативность: вы описываете результат, а не последовательность действий. Как именно его достичь, Terraform решает сам.
Что это даёт на практике:
- инфраструктура хранится в Git, изменения проходят code review;
- одинаковые окружения (staging, production) создаются из одного кода;
- видно, что изменится, ещё до применения;
- после сбоя окружение можно поднять заново, а не вспоминать, что было настроено руками.
Основные понятия
| Понятие | Что это |
|---|---|
| HCL | HashiCorp Configuration Language — язык файлов .tf, читаемый и похожий на JSON с комментариями |
| Provider | Плагин для работы с конкретной платформой: AWS, Google Cloud, Azure, DigitalOcean, Cloudflare и многими другими |
| Resource | Объект, которым управляет Terraform: сервер, DNS-запись, бакет, база данных |
| Data source | Чтение уже существующих данных (например, ID образа ОС) без управления ими |
| Variable / Output | Входные параметры и значения, которые Terraform выводит после применения |
| State | Файл, где Terraform хранит соответствие между кодом и реальными ресурсами |
Минимальный пример: один сервер
Пример для DigitalOcean — структура почти одинакова для любого провайдера:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
}
}
}
variable "do_token" {
type = string
sensitive = true
}
provider "digitalocean" {
token = var.do_token
}
resource "digitalocean_droplet" "web" {
name = "web-1"
image = "ubuntu-24-04-x64"
region = "fra1"
size = "s-1vcpu-1gb"
}
output "ip" {
value = digitalocean_droplet.web.ipv4_address
}
Токен не пишется в код: его передают через переменную окружения TF_VAR_do_token или отдельный файл, который не попадает в Git.
Цикл init → plan → apply
terraform init # скачать провайдеры, подготовить backend для state
terraform plan # показать, что будет создано, изменено, удалено
terraform apply # применить изменения после подтверждения
terraform destroy # удалить всё, что описано в конфигурации
- init запускается один раз в новом проекте и после смены провайдеров или backend.
- plan — самый важный шаг. Читайте его внимательно: символы
+,~и-показывают создание, изменение и удаление. Особенно опасна пометка о замене ресурса (-/+): сервер будет удалён и создан заново. - apply выполняет план. В CI обычно сохраняют план в файл (
terraform plan -out=tfplan) и применяют именно его, чтобы не получить сюрпризов.
Зачем нужен state и где его хранить
State — это «память» Terraform. Без него он не знает, что сервер web в коде — это конкретная машина с конкретным ID в облаке.
Правила работы со state:
- храните его удалённо (S3-совместимое хранилище, Terraform Cloud и т. п.), а не на ноутбуке разработчика;
- включайте блокировку (state locking), чтобы двое не запустили
applyодновременно; - не коммитьте state в Git — в нём могут быть пароли и ключи в открытом виде;
- не редактируйте файл руками — для этого есть команды
terraform stateиterraform import.
Типичные ошибки
- Ручные правки в панели облака. Terraform увидит расхождение (drift) и при следующем
applyвернёт всё как в коде. - Один огромный файл на всё. Разделяйте код на модули и окружения.
- Нет фиксации версий провайдеров. Указывайте ограничения версий и коммитьте
.terraform.lock.hcl. - apply без чтения plan. Самый частый путь к случайному удалению базы данных.
- Секреты в
.tf-файлах. Используйте переменные окружения или менеджер секретов.
Когда Terraform нужен, а когда нет
Terraform оправдан, если у вас облачная инфраструктура из нескольких компонентов, несколько окружений или команда, которой важно видеть историю изменений. Для одного VPS, который настраивается раз в год, он может быть избыточен — достаточно документированной инструкции.
Важно понимать границу: Terraform создаёт инфраструктуру, а установку пакетов и настройку ПО внутри серверов обычно делают другие инструменты, например Ansible, или готовые образы и контейнеры.
Официальная документация: developer.hashicorp.com/terraform.