Terraform 1.15: динамические источники модулей, устаревание переменных и новая функция convert()

В версии 1.15 появились const-переменные для динамических источников модулей, встроенный атрибут deprecated и функция convert(). Разбираем все изменения.

Обложка: Terraform 1.15: динамические источники модулей, устаревание переменных и новая функция convert()

Terraform 1.15, вышедший 13 мая 2026 года, позволяет использовать переменные прямо в путях к модулям — раньше это требовало жёсткого прописывания путей или обходных скриптов. Кроме того, в релизе появились атрибут deprecated для плавного вывода переменных из обращения, встроенная функция преобразования типов convert() и нативные сборки под Windows ARM64.

Релиз вышел 13 мая 2026 года. Авторы: Apoorva Murthy и Jacob Plicque, команда платформенной инженерии HashiCorp.

Ключевые выводы
Terraform 1.15: что изменилось
  • Атрибут const = true у переменной позволяет использовать её в source модуля и версионных ограничениях — динамические пути без хардкода
  • Новый атрибут deprecated на блоках variable и output: при использовании устаревшего параметра выдаётся предупреждение
  • Функция convert(value, type) — явное приведение типов для устранения неоднозначности в условных выражениях и пустых коллекциях
  • Нативные бинарники для Windows ARM64 (Surface Pro, Parallels на M1/M2)
  • S3-бэкенд теперь поддерживает аутентификацию через aws login (AWS CLI v2.32.0+) без долгосрочных ключей доступа

Terraform 1.15: динамические источники модулей

До версии 1.15 путь к модулю в блоке source должен был быть строковым литералом. Это вынуждало команды либо дублировать конфигурации, либо прибегать к скриптовым обёрткам. В 1.15 вводится атрибут const для переменных: он сигнализирует Terraform, что переменная известна на этапе terraform init и может участвовать в разрешении источников.

Атрибут const нельзя совмещать с sensitive или ephemeral — они взаимоисключающие. При попытке использовать в источнике обычную переменную без const = true Terraform выдаст ошибку на стадии init.

			variable "folder" {
  type  = string
  const = true
}

module "zoo" {
  source = "./${var.folder}"
}
		

Эта функциональность работает и для вложенных модулей, если их входные переменные также объявлены с const = true. Изменение особенно востребовано в крупных монорепозиториях, где среда окружения (dev/staging/prod) определяет, из какого пути загружается модуль.

Устаревание переменных и выходных значений

Авторы модулей теперь могут явно пометить переменную или выходное значение как устаревшее, не удаляя их из кода. Новый атрибут deprecated принимает строку с объяснением — она появляется в диагностическом предупреждении при валидации.

			# mod/main.tf
variable "bad" {
  deprecated = "Используйте 'good' вместо этого, переменная будет удалена"
}

output "old" {
  value      = var.some_value
  deprecated = "Используйте 'new', этот вывод будет удалён"
}
		

Предупреждение выдаётся в трёх ситуациях:

  • Значение передаётся в устаревшую переменную через CLI, переменные окружения или tfvars
  • В вызывающем модуле есть ссылка на устаревший вывод дочернего модуля
  • В вызывающем модуле есть ссылка на устаревший вывод в locals или других выражениях

Важное исключение: атрибут deprecated запрещён на выходных значениях корневого модуля — там его использование завершится ошибкой. Это ограничение сделано намеренно: корневой модуль — конечная точка исполнения, и устаревание на этом уровне лишено смысла.

Встроенное приведение типов: функция convert()

Система типов Terraform обычно справляется с неявными преобразованиями, но в ряде случаев выводит не тот тип: условные выражения с разными типами в ветках, пустые коллекции ({} как пустой объект, [] как пустой кортеж), сравнение без неявного приведения.

Новая функция convert() решает эти проблемы явным приведением типов прямо в HCL-выражении, без введения промежуточных переменных:

			# Создать пустую map(string) вместо пустого object{}
locals {
  empty_map = convert({}, map(string))
}

# Явно задать тип в условном выражении
output "result" {
  value = var.use_list ? convert([], list(string)) : ["default"]
}
		

Дополнительные изменения

Нативные сборки для Windows ARM64

Terraform теперь официально поддерживает Windows ARM64: устройства Surface Pro, Windows Dev Kit 2023, а также виртуальные машины Windows на Mac M1/M2 через Parallels. Отдельная сборка под архитектуру устраняет накладные расходы на эмуляцию x86_64.

S3-бэкенд: аутентификация через aws login

AWS CLI v2.32.0 представил метод aws login, позволяющий использовать учётные данные консоли управления для программного доступа без долгосрочных ключей доступа. S3-бэкенд Terraform теперь напрямую поддерживает этот механизм — нет необходимости отдельно настраивать AWS Provider.

Ограничения типов для выходных значений

Блоки output теперь поддерживают явные ограничения типов через атрибут type — аналогично тому, как это давно работает для входных переменных. Это помогает документировать и валидировать контракты модулей.

			output "instance_id" {
  type  = string
  value = aws_instance.main.id
}
		

Функции в mock-блоках тестов

Terraform Test теперь разрешает вызовы функций внутри mock-блоков. Это открывает возможность генерировать тестовые данные нужного формата: GUID через uuid(), идентификаторы Azure-ресурсов через format(). Ранее попытка вызвать функцию в mock завершалась ошибкой «Functions may not be called here».

Валидация переменных в Stacks

Для переменных в Terraform Stacks (CLI-фича) добавлена поддержка блока validation с атрибутами condition и error_message. Условие ссылается на значение переменной через var.value. Это позволяет авторам модулей выявлять ошибки конфигурации на стадии init, а не во время apply.

Часто задаваемые вопросы
1
Что такое const-переменная в Terraform 1.15?

Это переменная с атрибутом const = true, значение которой Terraform может использовать на стадии init — до основного цикла планирования. Такие переменные разрешены в атрибутах source и версионных ограничениях модулей. Обычные переменные в этих контекстах по-прежнему запрещены.

2
Как использовать атрибут deprecated для переменных?

Добавьте deprecated = "..." в блок variable или output. При передаче значения в эту переменную или ссылке на устаревший вывод Terraform выдаст диагностическое предупреждение с вашим сообщением. На выходные значения корневого модуля атрибут не распространяется.

3
Зачем нужна функция convert(), если Terraform и так выполняет приведение типов?

Неявное приведение работает не везде: в условных выражениях с разными типами в ветках, при создании пустых коллекций ({} интерпретируется как объект, а не map), при сравнениях без автоматического преобразования. Функция convert() снимает неоднозначность явно и делает намерение автора понятным из кода.

4
Как обновиться до Terraform 1.15?

Скачайте бинарник с официального сайта HashiCorp или обновите через менеджер пакетов. Перед обновлением ознакомьтесь с руководством по миграции на 1.15 — несмотря на то что это минорный релиз, в нём есть изменения в поведении диагностических предупреждений. Terraform Cloud и Enterprise-поддержка также обновлены.

5
Поддерживается ли Terraform 1.15 на Apple Silicon без Parallels?

Terraform на macOS ARM64 (Apple Silicon) поддерживался раньше. Нативные сборки ARM64 в 1.15 добавлены для Windows ARM64 — устройств на базе Snapdragon X (Surface Pro) и Dev Kit 2023. Для Mac M1/M2 речь идёт о поддержке виртуальных машин Windows через Parallels, а не о macOS-бинарниках.

Итоги

Terraform 1.15 закрывает один из самых популярных запросов на GitHub — динамические источники модулей. Это меняет подход к организации монорепозиториев платформенных команд.
Apoorva MurthyProduct Engineer, HashiCorp

Terraform 1.15 сосредоточен на удобстве авторов модулей: три крупных улучшения снижают количество шаблонного кода и делают конфигурации более выразительными. Поддержка Windows ARM64 и обновлённая аутентификация в S3 расширяют охват платформ и упрощают работу в корпоративных средах.

Скачайте Terraform 1.15, изучите руководство по обновлению и ознакомьтесь с полным списком изменений на GitHub.