Короткий ответ
terraform plan только вычисляет и показывает, какие изменения будут внесены, не трогая реальную инфраструктуру, а terraform apply выполняет эти изменения (и по умолчанию сам формирует план перед выполнением, запрашивая подтверждение).
Как это работает подробнее
plan строит граф различий между кодом/state и реальным состоянием ресурсов через API-запросы к провайдеру и выводит список действий (create / update in-place / destroy and re-create / destroy) без побочных эффектов, кроме, иногда, обновления данных state при чтении.
Пример кода
example.txt
# aws_instance.web must be replaced
-/+ resource "aws_instance" "web" {
ami = "ami-0123" -> "ami-0456" # forces replacement
instance_type = "t3.micro"
}
Plan: 1 to add, 0 to change, 1 to destroy.Что использовать на практике
- Практика. в CI/CD план обычно сохраняется в файл (
terraform plan -out=plan.tfplan) и прикладывается к Pull Request для review, а затем именно этот сохранённый план применяется (terraform apply plan.tfplan), чтобы между просмотром и применением инфраструктура не успела измениться.
Подводные камни
- Ошибка. запускать
applyбез предварительногоplanв проде "чтобы быстрее"; не замечать в выводе плана строку с destroy для важного ресурса (например, базы данных) из-за невнимательного чтения длинного вывода.