Что делает terraform init
Когда вы пишете в файле provider "aws" { ... }, Terraform не умеет ходить в AWS сам по себе. Ему нужен плагин-провайдер, отдельная программа, которая знает, как разговаривать с AWS API.
terraform init делает три вещи:
- Читает в вашем коде блок
required_providersи смотрит, какие плагины нужны. - Скачивает их из реестра Terraform Registry в папку
.terraform/рядом с вашим кодом. - Создаёт файл
.terraform.lock.hcl, там зафиксированы точные версии скачанных плагинов и их хеши. См. tf-lockfile.
После init директория готова к работе, можно запускать plan и apply.
Когда запускать
init нужно запустить первый раз после git clone чужого репозитория или после создания нового проекта. Также повторно если:
- В коде поменялся
required_providers(другой провайдер или другая версия). - Добавился или сменился блок
backend(где хранить state, см. tf-init-backends). - Появился новый блок
module "...".
Если ничего из этого не менялось, повторно запускать init не нужно.
Что появляется в директории
После первого init:
ваш-проект/
├── main.tf # ваш код
├── .terraform/ # появилось после init
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 5.60.0/
│ └── linux_amd64/
│ └── terraform-provider-aws_v5.60.0_x5
└── .terraform.lock.hcl # тоже появилось
Важно:
.terraform/, это кеш. Добавляйте в.gitignore, не коммитьте..terraform.lock.hcl, наоборот, обязательно коммитьте. Это гарантия, что у коллег скачаются те же версии провайдеров.
Полезные флаги
terraform init -upgrade, обновить провайдеры до самых свежих в рамках version constraint. Если в коде написаноversion = "~> 5.0", то-upgradeподнимет с 5.50 до 5.60, но не до 6.x.terraform init -reconfigure, переинициализировать с нуля. Нужен, когда вы поменяли настройкиbackendи Terraform спрашивает «мигрировать ли state».terraform init -input=false, не задавать интерактивных вопросов. Это режим для CI/CD.
Подводные камни
- Без интернета
initне работает. Плагины качаются с registry.terraform.io. В корпоративных сетях иногда настраивают зеркало черезterraform { provider_installation { ... } }в~/.terraformrc, см. tf-cli-config. - Корпоративный прокси. Если ваш бэкенд в офисе и интернет только через прокси. Нужно переменные
HTTPS_PROXYиHTTP_PROXYперед запуском. - Lockfile блокирует обновление. Если
initругается «requested version is not the locked version», значит в lockfile стоит одна версия, а вы хотите другую. Решение, либоinit -upgrade, либо явно поменяйте constraint. - Кеш в
.terraform/зависит от ОС. Если коллега работает на macOS, а вы на Linux,.terraform/нельзя просто перенести; каждый запускаетinitу себя.
Что внутри .terraform.lock.hcl
Маленький файл, который выглядит примерно так:
provider "registry.terraform.io/hashicorp/aws" {version = "5.60.0"
constraints = "~> 5.60"
hashes = [
"h1:abc123...",
"h1:def456...",
]
}
Это гарантия воспроизводимости: следующий init поставит ровно версию 5.60.0 с ровно этими хешами. Если хеши не сошлись, init упадёт. Это защита от подменённых пакетов.