how/modules
Что происходит на границе root → child module: ввод через variable, вывод через output, и почему модуль остаётся переиспользуемым только если он не лезет к глобальным провайдерам.
Модуль в Terraform - это функция. У неё есть параметры
(variable), есть тело (resource), есть возвращаемое значение
(output). Root-конфиг вызывает модуль через блок module "..." -
это «вызов функции».
Жми ▶ - посмотрим, как один и тот же S3-бакет можно описать через переиспользуемый модуль, и что Terraform делает на каждом шаге.
В main.tf написан блок module "bucket". source указывает,
откуда взять код модуля - local-папка, git, Terraform Registry.
Сам модуль (modules/bucket/) лежит рядом, но ещё не активирован -
Terraform его только обнаружил при init. На этой стадии модуль -
просто скачанные файлы, никаких ресурсов не создано.
итого
Что важно запомнить:
variable.
Никакого глобального state, никаких «магических» провайдеров -
только то, что ты явно объявил. Это и делает модуль переиспользуемым.sensitive = true на variable или output сохраняется при
пересечении границы - Terraform будет маскировать значение в
логах и плане. См. tf-sensitive.providers = { aws = aws.us-east-1 } - иначе модуль использует
default-провайдера root'а, и multi-region-сценарии ломаются.Дальше: tf-remote-backend-lock про то, как два инженера одновременно работают с одним state'ом.