linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/how/tf-plan-three-way-diff

how/state

Plan как трёхсторонний дифф: HCL ↔ state ↔ облако

Что на самом деле сравнивает terraform plan. Зачем refresh, как из трёх источников получается один план, и что прячет -refresh=false.

Привычная картинка про git diff - это двусторонний дифф: было / стало. В Terraform диффов три, и они образуют треугольник:

  • main.tf - желаемое состояние. То, что ты написал руками.
  • terraform.tfstate - кэш Terraform. Снимок реальности, каким Terraform его видел в последний раз.
  • облако (AWS, GCP, LocalStack) - реальное состояние ресурсов.

terraform plan сначала чинит одну сторону треугольника (state ↔ cloud, через refresh), а потом считает диф по другой (HCL ↔ state). Жми ▶ - посмотрим, как это собирается.

step 1/6·00 · после предыдущего apply
MAIN.TFжелаемое состояниеTERRAFORM.TFSTATEчто terraform знаетAWSреальностьaws_s3_bucket.demoOwner = "student"aws_s3_bucket.demoOwner = "student"aws_s3_bucket.demoOwner = "student"после предыдущего apply: три источника сошлись

§ шаги

  1. Базовая позиция треугольника: все три источника согласны.

    • HCL описывает один бакет с тегом Owner = "student".
    • state знает про этот бакет и помнит тот же тег.
    • в AWS реально лежит один такой бакет.

    Повторный plan сейчас вернёт No changes. Это инвариант, к которому Terraform всегда стремится после успешного apply.

итого

Главное про трёхсторонний дифф:

  • plan - это refresh + diff, в этом порядке. Сначала state синхронизируется с облаком, потом сравнивается с HCL. Если поменять порядок, получится не план, а каша.
  • В одном плане могут жить разные расхождения: дрейф, который надо откатить, и новый ресурс, который надо создать. Они приезжают в одном выводе.
  • -refresh=false пропускает первый шаг. План становится быстрым, но слепым: Terraform не увидит, если кто-то правил руками в облаке. Удобно для pre-commit-проверок локально, опасно для CI и для prod-плана.
  • В Terraform 1.5+ есть отдельная команда terraform plan -refresh-only - получает только обновлённый state, без сравнения с HCL. Полезна для drift detection.

Дальше: tf-drift про то, что делать, когда дрейф уже виден, и tf-state-mv-rm-import про императивные операции на state.

§ копнуть в базу знаний

  • tf-planterraform plan - рефреш, дифф, exit-коды
  • tf-stateЧто внутри state-файла
  • tf-driftDrift: state и реальность разошлись
  • tf-refresh-onlyplan -refresh-only для drift detection
  • tf-plan-flagsФлаги plan: -target, -var-file, -refresh

§ попробовать руками

  • ›tf-beginner-03-plan- Plan: читаем вывод и понимаем намерения
  • ›tf-garden-02-state-drift- Сломанный сад: state drift
  • ›tf-production-10-drift-detection- Drift detection в GitHub Actions
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки