#plan-vs-apply-semantics
Что делает `terraform plan` против `apply`? Что апплай делает с plan'ом?
Что отвечать
Plan читает state + HCL, опрашивает провайдер (refresh), считает diff, печатает что собирается сделать и почему. Ничего не меняет в провайдере. Apply берёт уже посчитанный план (из файла `-out=plan.tfplan` или на лету через interactive prompt) и выполняет change set. Если apply запускается без `-out`, он сам делает plan под капотом, потом применяет - это удобно локально, но в CI правильно: plan→artifact→apply из artifact'а. Так ревью видит ровно то, что катится.
Что хотят услышать
Senior должен: - назвать ключевую разницу: plan side-effect free (кроме refresh), apply мутирует и обновляет state - объяснить `-out=plan.tfplan`: бинарный артефакт, в нём зафиксирован снимок state + change set; apply применяет ровно этот change set - сказать что между plan и apply state может измениться (кто-то зашёл в Console и поменял) - apply на stale план может упасть с «expected state did not match» - упомянуть `terraform show -json plan.tfplan` для парсинга и post-processing в CI (cost estimation, OPA policy)
Подводные камни
- ✗ Бегать `apply -auto-approve` в CI без сохранённого plan'а - что ревьюер видел и что покатилось может расходиться
- ✗ Не учитывать что refresh между plan и apply может найти новый drift, apply на stale-plan'е упадёт
- ✗ Сохранять plan-файл как artifact публично - он содержит state secrets в plain
Follow-up
- ? Зачем `-out` если можно `terraform apply` напрямую?
- ? Что произойдёт если apply пытается применить устаревший plan?
- ? Как защитить tfplan-артефакт в CI? Что в нём чувствительно?
Глубина в базе знаний