Вопрос с собеседования · DevOps

Как работает 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 после смены лицензии

Подробно

Цикл работы:

  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, удалённое хранение и блокировка.
  • Дрейф и безопасная работа в команде.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗State можно не хранить — Terraform сам найдёт ресурсы
  • ✗apply выполняется без предварительного сравнения
  • ✓State связывает ресурсы кода с реальными объектами; хранят удалённо с блокировкой
  • ✗State лучше хранить в Git рядом с кодом, блокировка не нужна

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования