Перейти к содержанию
Innovialabs

Что такое Terraform: провайдеры, ресурсы и цикл plan/apply

Основы4 мин

Коротко

Terraform — инструмент Infrastructure as Code: вы описываете нужную инфраструктуру в файлах HCL, а он сам сравнивает её с реальностью и создаёт, меняет или удаляет ресурсы через API облака.

Что такое Terraform простыми словами

Terraform — это инструмент для подхода Infrastructure as Code (IaC). Вместо того чтобы вручную кликать в панели облака, вы пишете текстовый файл: «нужен сервер такого размера, в такой сети, с таким firewall». Terraform читает файл, сравнивает с тем, что уже существует, и приводит инфраструктуру к описанному состоянию.

Главная идея — декларативность: вы описываете результат, а не последовательность действий. Как именно его достичь, Terraform решает сам.

Что это даёт на практике:

  • инфраструктура хранится в Git, изменения проходят code review;
  • одинаковые окружения (staging, production) создаются из одного кода;
  • видно, что изменится, ещё до применения;
  • после сбоя окружение можно поднять заново, а не вспоминать, что было настроено руками.

Основные понятия

ПонятиеЧто это
HCLHashiCorp 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.

Частые вопросы

OpenTofu — открытый форк Terraform, появившийся после смены лицензии HashiCorp. Синтаксис HCL и базовый workflow совместимы, поэтому знания переносятся. Выбор обычно зависит от лицензионных требований компании и нужных интеграций.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.