Как работает Terraform и зачем ему state?
- Что такое дрейф конфигурации?
- Почему state нельзя хранить в Git?
Terraform декларативно описывает ресурсы (сети, ВМ, базы, DNS) на HCL. plan сравнивает код, state и реальность и показывает, что будет создано, изменено, удалено; apply выполняет. State — соответствие ресурсов в коде реальным объектам с их идентификаторами; без него Terraform не знает, чем управляет. Хранят его удалённо (S3-совместимое хранилище, Terraform Cloud) с блокировкой — иначе два apply одновременно испортят state.
- В state бывают секреты в открытом виде — шифровать хранилище и ограничивать доступ
- Дрейф — ручные изменения в облаке; plan их покажет, apply откатит к коду
- Читать plan перед apply: «destroy» базы данных — повод остановиться
А ещё OpenTofu — открытый форк Terraform после смены лицензии
Подробно
Цикл работы:
terraform init— провайдеры и бэкенд state.terraform plan— разница между кодом и реальностью.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 минут бесплатно.