Получить доступ

Как работает Terraform и зачем ему state?

MiddleИнфраструктура как код и облакаTerraform
Ещё спрашивают так:
  • Что такое дрейф конфигурации?
  • Почему state нельзя хранить в Git?
Коротко

Terraform декларативно описывает ресурсы (сети, ВМ, базы, DNS) на HCL. plan сравнивает код, state и реальность и показывает, что будет создано, изменено, удалено; apply выполняет. State — соответствие ресурсов в коде реальным объектам с их идентификаторами; без него Terraform не знает, чем управляет. Хранят его удалённо (S3-совместимое хранилище, Terraform Cloud) с блокировкой — иначе два apply одновременно испортят state.

  • В state бывают секреты в открытом виде — шифровать хранилище и ограничивать доступ
  • Дрейф — ручные изменения в облаке; plan их покажет, apply откатит к коду
  • Читать plan перед apply: «destroy» базы данных — повод остановиться

А ещё OpenTofu — открытый форк Terraform после смены лицензии

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Цикл работы:

  1. terraform init — провайдеры и бэкенд state.
  2. terraform plan — разница между кодом и реальностью.
  3. terraform apply — применение, обновление state.

Почему не в Git: state меняется при каждом apply, содержит секреты, конфликтует при параллельной работе. Удалённый бэкенд с блокировкой решает все три проблемы.

Организация:

  • модули для повторяющихся частей (сеть, кластер);
  • отдельный state на окружение и на крупный блок — меньше радиус ошибки и быстрее plan;
  • plan в CI на каждый PR, apply после ревью;
  • lifecycle { prevent_destroy = true } для критичных ресурсов;
  • импорт существующих ресурсов (import) вместо ручного пересоздания.

Дрейф обнаруживают регулярным plan по расписанию.

Пример

terraform {
  backend "s3" {
    bucket = "tf-state"
    key    = "prod/network.tfstate"
    region = "ru-central1"
    endpoints = { s3 = "https://storage.yandexcloud.net" }
  }
}

resource "yandex_vpc_network" "main" {
  name = "prod"
}

resource "yandex_vpc_subnet" "app_a" {
  network_id     = yandex_vpc_network.main.id
  zone           = "ru-central1-a"
  v4_cidr_blocks = ["10.0.0.0/20"]
}

Что хотят услышать

  • plan/apply и декларативная модель.
  • Назначение state, удалённое хранение и блокировка.
  • Дрейф и безопасная работа в команде.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем