Провайдеры Terraform: установка, версии, required_providers

Рейтинг: 64.6% · 12 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Провайдеры Terraform: установка, версии, required_providers

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers (вы здесь)
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Ты пишешь конфиг, набираешь resource "yandex_compute_instance", жмёшь terraform apply - и получаешь ошибку, что Terraform понятия не имеет, что такое yandex_compute_instance. Знакомая боль? Дело в том, что сам Terraform ничего не умеет. Совсем. Он не знает ни про Yandex Cloud, ни про AWS, ни про твой домашний роутер. Это просто движок, который читает HCL, строит граф зависимостей и решает, что создать, изменить или снести. А вот руки, которыми он дёргает реальные API - это провайдеры. И именно с того, как их правильно подключить, зафиксировать и обновлять, начинается любой вменяемый проект инфраструктуры как кода.

В этом уроке разберём блок required_providers, семантику версий, что делает terraform init, зачем нужен файл .terraform.lock.hcl (и почему его коммитят в git), и как жить с провайдером в РФ через зеркало. Тема скучная на первый взгляд, но именно тут чаще всего ломаются сборки в CI, когда "у меня локально всё работало".

Что такое провайдер и зачем он нужен

Провайдер - это плагин. Отдельный бинарник, который Terraform скачивает и запускает рядом с собой. Провайдер знает, как разговаривать с конкретным API: какие у ресурсов поля, как создать виртуалку, как удалить сеть, как прочитать состояние. Terraform общается с плагином по своему внутреннему протоколу, а плагин уже переводит это в HTTP/gRPC-запросы к облаку.

Грубо говоря, Terraform - это коробка передач, а провайдер - это мотор под конкретное топливо. Хочешь Yandex Cloud - ставишь провайдер yandex. Нужен ещё S3-бакет в AWS параллельно - подключаешь второй провайдер. В одном проекте их может быть сколько угодно: yandex, kubernetes, helm, random, tls. Каждый тянет свой набор ресурсов и data-источников.

Откуда они берутся? Из реестра. По умолчанию это публичный Terraform Registry на registry.terraform.io. У провайдера есть адрес-источник в формате namespace/type, например yandex-cloud/yandex. Это полное имя - registry.terraform.io/yandex-cloud/yandex. Terraform по этому адресу ходит, узнаёт список версий, выбирает подходящую и качает бинарник под твою ОС и архитектуру.

Изображение

Блок terraform: required_providers и required_version

Зависимости проекта объявляются не где попало, а в специальном блоке terraform. Это служебный блок настроек самого движка. Минимальный честный пример для Yandex Cloud:

Код: Выделить всё

terraform {
  required_version = ">= 1.6"

  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
      version = "~> 0.140"
    }
  }
}

provider "yandex" {
  zone = "ru-central1-d"
  # token, cloud_id, folder_id обычно берутся из переменных окружения
  # YC_TOKEN, YC_CLOUD_ID, YC_FOLDER_ID
}
Разберём по строчкам. required_version - ограничение на версию самого Terraform (или OpenTofu). Если у тебя в команде кто-то на древней 1.3, а конфиг требует 1.6 - инструмент честно откажется работать, а не сломается на середине. required_providers - словарь зависимостей. Ключ yandex - это локальное имя, по которому ты ссылаешься на провайдер в блоках resource и provider. source - откуда качать. version - какие версии допустимы.

Обрати внимание: source писать обязательно. Раньше Terraform умел угадывать namespace hashicorp по короткому имени, но для сторонних провайдеров вроде yandex это не работает - нужен полный адрес yandex-cloud/yandex, иначе init пойдёт искать hashicorp/yandex и ничего не найдёт.

Семантика версий: что значат стрелочки

Версии провайдеров живут по semver: major.minor.patch, например 0.140.3. Ограничения в поле version - это не просто "хочу вот эту", а правила, какой диапазон допустим.
  • = 0.140.3 - ровно эта версия, ни шагом влево. Жёстко, но иногда нужно.
  • >= 0.140 - эта и любая новее. Опасно: завтра выйдет ломающее обновление, и init его подтянет.
  • ~> 0.140 - так называемый pessimistic constraint. Разрешает обновлять последнюю указанную цифру. Для 0.140 это значит >= 0.140.0 и < 0.141.0, то есть только патчи внутри минорной версии.
  • ~> 1.4 (для двузначной записи) - разрешает любой минор внутри мажора: >= 1.4.0 и < 2.0.0.
На практике для большинства проектов берут ~>. Он ловит баг-фиксы автоматически, но не пустит мажорный апгрейд с ломающими изменениями без твоего ведома. Yandex-провайдер исторически живёт в ветке 0.x, поэтому ~> 0.140 ведёт себя строго - только патчи. Это нормально, фиксируй конкретную минорную линейку и обновляйся осознанно.

Главное правило: ограничение версии в HCL задаёт коридор допустимого, а конкретную версию из этого коридора выбирает init и записывает в lock-файл. Это две разные вещи, и путать их - классическая ошибка новичка.

terraform init и lock-файл .terraform.lock.hcl

Команда terraform init - это первое, что ты запускаешь в новом проекте. Она читает required_providers, ходит в реестр, скачивает подходящие бинарники в скрытую папку .terraform/ и - внимание - создаёт или обновляет файл .terraform.lock.hcl.

Lock-файл - это слепок ровно тех версий, которые реально установились, плюс их криптографические хэши. По смыслу это полный аналог package-lock.json из npm или composer.lock из PHP. Зачем он:
  • Повторяемость. У тебя version = "~> 0.140" - коридор широкий. Без lock-файла на твоей машине встанет 0.140.1, а в CI через неделю - уже 0.140.5, и поведение может разойтись. Lock прибивает гвоздями конкретную версию для всех.
  • Безопасность. В файле лежат хэши (h1: и zh:) скачанных бинарников. Если кто-то подменит пакет в зеркале - хэш не сойдётся, init заорёт.
Поэтому правило железобетонное: .terraform.lock.hcl коммитим в git. Это не временный мусор, это часть проекта. А вот папку .terraform/ (где лежат сами бинарники и кэш) - наоборот, в .gitignore. Не путай эти две сущности: одна - манифест зависимостей, вторая - скачанные килограммы.

К 2026 году привычка коммитить lock-файл стала стандартом де-факто и в Terraform, и в OpenTofu (открытый форк, который многие в РФ выбрали как замену из-за лицензии и санкционных вопросов; команды у него те же, файл состояния и lock-файл совместимы). Свежие версии OpenTofu, кстати, починили давнюю боль с хэшами при работе через локальное зеркало - реестр теперь отдаёт оба формата хэшей сразу, и не приходится отдельно гонять providers lock.

Реестр, зеркало и реалии РФ

Тут начинается специфика. Публичный Terraform Registry от HashiCorp из России работает нестабильно: то отвалится, то отдаст ошибку Failed to query available provider packages. Решение - официальное зеркало Yandex Cloud. Создаёшь в домашней папке файл конфигурации CLI (обычно ~/.terraformrc, на Windows - %APPDATA%/terraform.rc) и прописываешь установку через зеркало:

Код: Выделить всё

provider_installation {
  network_mirror {
    url = "https://terraform-mirror.yandexcloud.net/"
  }
  direct {
    exclude = ["registry.terraform.io/*/*"]
  }
}
Здесь network_mirror говорит: все провайдеры качай вот отсюда. Блок direct с exclude отключает обращения к недоступному из РФ публичному реестру. После этого terraform init берёт yandex (и многие другие провайдеры) с зеркала Яндекса, и сборка перестаёт зависеть от настроения HashiCorp.

Обновление провайдера: init -upgrade

Раз lock-файл прибивает версию, обычный terraform init её больше не двигает - он уважает то, что записано. Чтобы подтянуть свежие версии в рамках твоих ограничений, есть отдельный флаг:

Код: Выделить всё

terraform init -upgrade
Эта команда заново смотрит в реестр, берёт максимально новую версию, разрешённую твоим version-ограничением, переустанавливает её и перезаписывает lock-файл. Дальше ты смотришь diff lock-файла, прогоняешь terraform plan, убеждаешься, что план не разъехался, и коммитишь обновлённый lock одним отдельным коммитом. Так апгрейды остаются управляемыми и обратимыми.

Типичные грабли
  • Забыл source. Пишешь только version - init ищет hashicorp/yandex и падает. Для сторонних провайдеров source обязателен.
  • .terraform/ в репозитории. Закоммитил папку с бинарниками - распух репозиторий, конфликты при смене ОС. Коммить только lock-файл, папку - в .gitignore.
  • >= вместо ~>. Поставил version = ">= 0.140" без верхней границы - однажды прилетит мажор с ломающими изменениями и снесёт прод. Используй ~>.
  • Lock-файл из другой ОС. Хэши h1: привязаны к платформам. Если в lock только хэши под macOS, а CI на Linux - init может ругаться. Лечится командой terraform providers lock с указанием нужных платформ или генерацией хэшей под все целевые ОС.
  • Удалил lock после конфликта. Снёс файл, чтобы "не мешал" - потерял фиксацию версий и весь смысл повторяемости. Решай конфликт через init -upgrade, а не удалением.
Мини-лаба

Повтори руками, 15 минут:
  • Создай пустую папку, положи main.tf с блоком terraform и required_providers для yandex (source yandex-cloud/yandex, version ~> 0.140) и блоком provider "yandex" с zone = "ru-central1-d".
  • Если ты в РФ - пропиши зеркало в ~/.terraformrc как выше.
  • Запусти terraform init. Посмотри, что появилась папка .terraform/ и файл .terraform.lock.hcl. Открой lock-файл и найди строки version, constraints и hashes.
  • Поменяй version на ~> 0.139 и снова сделай init. Посмотри, как лок попробует откатиться (или потребует -upgrade).
  • Верни ~> 0.140, выполни terraform init -upgrade и сравни git diff lock-файла.
Контрольные вопросы
  • Чем отличается ограничение version в required_providers от версии, записанной в .terraform.lock.hcl?
  • Что означает ~> 0.140 и чем это безопаснее, чем >= 0.140?
  • Почему .terraform.lock.hcl коммитят в git, а папку .terraform/ - нет?
  • Какой командой обновить провайдер до свежей версии в рамках ограничений и что при этом меняется в проекте?
Итог: что запомнить

Terraform сам по себе пустой движок, всю работу с API делают провайдеры-плагины. Зависимости объявляй в блоке terraform: required_version под движок, required_providers под плагины, и для yandex обязательно указывай source = "yandex-cloud/yandex". Версии фиксируй через ~>, а не голым >=. terraform init скачивает провайдеры и создаёт .terraform.lock.hcl - этот файл коммить в git, он гарантирует, что у тебя, у коллеги и в CI стоят одинаковые версии с проверенными хэшами. В РФ ставь провайдеры через зеркало terraform-mirror.yandexcloud.net. Обновляйся осознанно командой init -upgrade, проверяя план и diff лока. Это и есть инфраструктура как код по-взрослому: предсказуемо, повторяемо, под контролем версий.
👍3 ❤️3 🔥1 😄 🤔1
Аватара пользователя
emacssmith
Сообщения: 1
Зарегистрирован: 21 май 2026, 13:37

Re: Провайдеры Terraform: установка, версии, required_providers

Сообщение emacssmith »

Спасибо, наконец дошло зачем этот lock-файл вообще нужен. У меня как раз в CI вечно версия провайдера другая чем локально, теперь понятно почему - я его в gitignore засунул вместе с папкой .terraform. Перенесу.
👍1 ❤️ 🔥1 😄 🤔2
Аватара пользователя
juniorheap
Сообщения: 1
Зарегистрирован: 15 май 2026, 05:13

Re: Провайдеры Terraform: установка, версии, required_providers

Сообщение juniorheap »

А если я на OpenTofu сижу а не на терраформе, команды init и init -upgrade точно такие же? И lock-файл совместим если коллега на терраформе?
👍1 ❤️2 🔥 😄 🤔
Ответить
← Предыдущая глава
Секреты в ресурсах и состоянии, ephemeral-значения
Следующая глава →
Несколько копий одного провайдера: alias и мультизона

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: terraform yandex cloud с чего начать новичкукак установить terraform и opentofu на linuxчто такое terraform state и tfstate простыми словамиудаленный backend terraform на object storage yandex cloudчто такое инфраструктура как код iac простыми словамиterraform plan и apply что делают и чем отличаются

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя