Lock-файл Terraform и OpenTofu: фиксируем версии и проверяем обновление провайдера

На ноутбуке plan без изменений, а в CI после init появились новые предупреждения и другой diff. Конфигурация содержит ограничение ~> 3.6, но это диапазон, а не одна версия пакета. Если выбранная версия и контрольные суммы не зафиксированы одинаково, окружения могут установить разные допустимые providers.

Файл .terraform.lock.hcl хранит решение о выборе provider и известные checksums пакетов. Его обычно коммитят вместе с конфигурацией. Каталог .terraform содержит установленные файлы и служебные данные рабочего каталога; его содержимое не заменяет lock-файл в репозитории.

Ограничение и выбор решают разные задачи

В новом учебном каталоге объявите provider random. В примере указан полный адрес registry.terraform.io, чтобы источник был одинаково явным в Terraform и OpenTofu. Если команда использует registry.opentofu.org, выберите и зафиксируйте соответствующий source отдельно.

terraform {
  required_providers {
    random = {
      source  = "registry.terraform.io/hashicorp/random"
      version = "~> 3.6.0"
    }
  }
}

resource "random_id" "demo" {
  byte_length = 4
}

Terraform init или tofu init выбирает допустимую версию и создаёт lock-файл. Ограничение ~> 3.6.0 допускает патч-версии ветки 3.6, но исключает 3.7. Выбранная точная version будет записана в lock. При следующем обычном init инструмент старается использовать зафиксированное решение, если оно удовлетворяет ограничениям.

Проверим отсутствие незаметного обновления

terraform init -lockfile=readonly
terraform plan
tofu init -lockfile=readonly
tofu plan

Выберите свой набор команд. Readonly подходит для CI, который должен использовать проверенный выбор, а не дописывать lock по ходу релиза. Если конфигурация требует другую версию, ошибка инициализации становится поводом обновить зависимости отдельной правкой. Она не должна лечиться удалением lock в каждом pipeline.

Для осознанного обновления сначала измените ограничение при необходимости, затем выполните init -upgrade и рассмотрите diff lock-файла. Upgrade ищет новые допустимые решения. После него нужен новый plan и проверка заметных изменений provider, а не только подтверждение скачивания пакета.

Контрольные суммы зависят и от платформы

Один provider выпускается отдельными пакетами для разных ОС и архитектур. Ситуация «macOS проходит, Linux CI не проходит checksum» требует проверить источник пакета, платформы и способ наполнения lock. В согласованном процессе можно заранее записать checksums нужных платформ через providers lock.

terraform providers lock -platform=linux_amd64 -platform=darwin_arm64
tofu providers lock -platform=linux_amd64 -platform=darwin_arm64

Эти команды обращаются к источникам provider и меняют lock-файл, поэтому их результат тоже проходит ревью. При использовании filesystem/network mirror учитывайте, откуда получены контрольные суммы и подписи. Несовпадение не стоит устранять ручной заменой hash на сумму любого найденного архива.

Что lock не фиксирует

Lock-файл provider не закрепляет версию самого CLI и не служит полноценным lock для удалённых модулей. Версию Terraform/OpenTofu задают отдельно, а источники модулей фиксируют подходящими version или ref. План также зависит от входных переменных и текущего состояния удалённых объектов.

Формат имени .terraform.lock.hcl используется в обоих продуктах, но адрес registry — часть идентичности provider. Переход между продуктами и registry требует проверить source, выбранную версию и checksums, а не считать одинаковое имя файла доказательством полной взаимозаменяемости. Механика описана для Terraform и OpenTofu.

Завершённое обновление выглядит как связанный набор: изменение диапазона при необходимости, проверенный diff lock, план на выбранной версии и рабочая установка в CI без модификации lock. Тогда повторяемость обеспечивается конкретными входами, а не надеждой, что init сегодня выберет тот же пакет.

Ещё по теме

Продолжить изучение

Хотите управлять инфраструктурой через код и понимать последствия изменений? Plan, state, модули и работа с существующими ресурсами — темы программы «Terraform и OpenTofu: инфраструктура как код».

Продолжить на практике

  • Terraform и OpenTofu: инфраструктура как код ↗

    Описывайте инфраструктуру в коде, проверяйте изменения до применения и работайте со state без сюрпризов. HCL, модули, remote state, импорт, CI и различия Terraform/OpenTofu — на воспроизводимом учебном окружении.