linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/how/tf-module-io-flow

how/modules

Модули: как переменные текут вниз, а outputs - вверх

Что происходит на границе root → child module: ввод через variable, вывод через output, и почему модуль остаётся переиспользуемым только если он не лезет к глобальным провайдерам.

Модуль в Terraform - это функция. У неё есть параметры (variable), есть тело (resource), есть возвращаемое значение (output). Root-конфиг вызывает модуль через блок module "..." - это «вызов функции».

Жми ▶ - посмотрим, как один и тот же S3-бакет можно описать через переиспользуемый модуль, и что Terraform делает на каждом шаге.

step 1/6·00 · root объявляет модуль
ROOT: MAIN.TFтвой проектMODULES/BUCKETreusable HCLmodule "bucket" { source = "./modules/bucket" name = "linuxlab-prod" versioning = true}# использование output:output "site_url" { value = module.bucket.url}variable "name" {}variable "versioning" {}resource "aws_s3_bucket" "this" { bucket = var.name versioning { enabled = var.versioning }}output "url" { value = aws_s3_bucket.this.website_endpoint}root зовёт модуль block'ом · модуль рядом, ещё не активирован

§ шаги

  1. В main.tf написан блок module "bucket". source указывает, откуда взять код модуля - local-папка, git, Terraform Registry.

    Сам модуль (modules/bucket/) лежит рядом, но ещё не активирован - Terraform его только обнаружил при init. На этой стадии модуль - просто скачанные файлы, никаких ресурсов не создано.

итого

Что важно запомнить:

  • Модуль не видит ничего, что не передано ему через variable. Никакого глобального state, никаких «магических» провайдеров - только то, что ты явно объявил. Это и делает модуль переиспользуемым.
  • Outputs модуля - единственный канал, через который root получает данные изнутри. Если outputs нет, считай что модуль - чёрный ящик.
  • sensitive = true на variable или output сохраняется при пересечении границы - Terraform будет маскировать значение в логах и плане. См. tf-sensitive.
  • В модуль можно (и нужно) пробрасывать провайдер через providers = { aws = aws.us-east-1 } - иначе модуль использует default-провайдера root'а, и multi-region-сценарии ломаются.
  • Версионирование модулей через [[tf-module-versioning|source = "...?ref=v1.2.0"]] - обязательно для production, иначе любой коммит в исходник потенциально меняет твою инфру.

Дальше: tf-remote-backend-lock про то, как два инженера одновременно работают с одним state'ом.

§ копнуть в базу знаний

  • tf-module-basicsБазовые сведения о модулях
  • tf-module-inputs-outputsvariable и output в модулях
  • tf-module-sourcesОткуда брать модули: local, git, registry
  • tf-module-versioningВерсионирование модулей
  • tf-sensitivesensitive = true через границу модуля

§ попробовать руками

  • ›tf-intermediate-01-first-module- Первый модуль
  • ›tf-intermediate-02-module-from-registry- Модуль из Terraform Registry
  • ›tf-intermediate-03-module-for-each- for_each на модуль
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки