Короткий ответ
terraform fmt приводит код к единому стилю форматирования (отступы, выравнивание), а terraform validate проверяет синтаксическую корректность и внутреннюю согласованность конфигурации без обращения к реальному API провайдера — поэтому ошибки, зависящие от реального состояния облака (квоты, права доступа, занятые имена), validate не отловит.
Как это работает подробнее
validate работает локально, разбирая HCL и проверяя схему ресурсов из уже установленных провайдеров (после terraform init), но не выполняет сетевые запросы к облаку и не знает о внешних ограничениях; fmt просто переформатирует файлы по канонизированным правилам HCL и ничего не проверяет по смыслу.
Пример кода
commands.sh
$ terraform fmt -check -recursive
$ terraform validate
Success! The configuration is valid.Что использовать на практике
- Практика. оба инструмента полезно запускать в CI как самый быстрый и дешёвый первый шаг pipeline (до plan), отбраковывая явные ошибки раньше, чем кто-либо начнёт ждать результат plan;
fmt -checkв CI (без изменения файлов) используют, чтобы требовать единообразного стиля в Pull Request.
Подводные камни
- Ошибка. считать прохождение
validateдостаточной гарантией успешного apply и пропускать этапplan/review; не настраиватьfmt -checkв CI, из-за чего в репозитории копится разнородно отформатированный код, усложняющий diff в Pull Request.