Что такое Terraform и зачем он нужен?

Terraform — это инструмент инфраструктуры как кода (Infrastructure as Code). С его помощью инфраструктуру (виртуальные машины, сеть, хранилища, DNS, managed-сервисы и т. п.) описывают в виде текстовых конфигураций, хранят в системе контроля версий и автоматически приводят облако к описанному состоянию. Это даёт воспроизводимость, прозрачность изменений и возможность ревью/автоматизации развёртываний.

Основные концепты и как это работает

  • HCL (конфигурации) — читаемый язык для описания provider, resource, variable, output, модулей и т.д.

  • Providers — плагины, через которые Terraform общается с API облаков и сервисов.

  • Resources — объекты, которыми управляет Terraform (vm, subnet, bucket и т. п.).

  • State (terraform.tfstate) — локальное или удалённое представление текущего состояния созданных ресурсов; Terraform использует state, чтобы вычислить разницу между текущим и желаемым состоянием.

  • Plan & Apply — terraform plan показывает, какие изменения будут, terraform apply применяет их. Двухшаговый процесс предотвращает непреднамеренные изменения.

  • Modules — переиспользуемые блоки конфигурации для вынесения повторяющейся логики.

  • Workspaces — удобный способ держать несколько инстансов окружений (dev/stage/prod) в рамках одной конфигурации (иногда заменяют на отдельные state/backends).

Полезные команды (коротко)

  • terraform init — инициализация провайдеров и бекенда.

  • terraform fmt — приведение кода к единому стилю.

  • terraform validate — базовая проверка конфигурации.

  • terraform plan — предпросмотр изменений.

  • terraform apply — применение изменений.

  • terraform destroy — удаление управляемых ресурсов.

  • terraform import — импорт существующих ресурсов в state.

Практики и архитектура для команды

  • Remote state + locking: храните state в удалённом бекенде (S3, GCS, Terraform Cloud и т.д.) с блокировкой, чтобы команда не портила состояние.

  • Версионирование провайдеров и Terraform: фиксируйте версии, чтобы избежать сюрпризов при апдейтах.

  • Модули и разделение на слои: network, infra, apps — каждый слой отдельным модулем/репозиторием.

  • CI/CD: в PR запускать terraform fmt/validate/plan, apply делать через контролируемый pipeline после ревью. Инструменты типа Atlantis/Run-in-remote помогают безопасно автоматизировать apply.

  • Secrets: не храните секреты в tfstate и переменных; интегрируйте secret-manager или Vault, используйте ссылки/данные, а не жёсткие значения.

  • Малые изменения: делайте атомарные PR — проще ревью и легче откатить.

Подводные камни и ограничения

  • State содержит реальные идентификаторы и иногда чувствительные данные — доступ к нему должно быть строго контролируемо.

  • Drift: ручные изменения в консоли приводят к рассинхрону; регулярно делать terraform plan и устранять drifts.

  • Provisioners и побочные скрипты: использовать осторожно — они ломают идемпотентность; лучше готовить образы (Packer) или конфигурировать через конфиг-менеджер.

  • Сложность в больших-monorepo: требуется дисциплина модулей, remote state и orchestration (Terragrunt/Automation wrappers помогают).

Дополнительные возможности

  • Data sources — получение данных от провайдеров для использования в конфиге.

  • Lifecycle — управление порядком создания/удаления, предотвращение удаления (prevent_destroy).

  • For_each / count / depends_on — выражения для динамического создания ресурсов.

  • Integrations: Terraform легко вписывается в GitOps/CI, его можно сочетать с инструментами для policy-as-code, image baking и автоматического тестирования инфраструктуры.