Короткий ответ
Модуль — это набор .tf файлов с собственными input-переменными и output-значениями, который можно вызывать (module-блоком) многократно с разными параметрами, что избавляет от копипасты и делает инфраструктуру единообразной и проще в поддержке.
Как это работает подробнее
модуль — обычная папка с конфигурацией, у которой есть "интерфейс" (variables.tf — входы, outputs.tf — выходы); корневая конфигурация вызывает его через module "name" { source = "./modules/x" ... }, передавая значения переменных, а Terraform встраивает ресурсы модуля в общий граф.
Пример кода
main.tf
module "web_bucket" {
source = "./modules/s3-bucket"
name = "web-assets-prod"
tags = { Env = "prod" }
}
module "logs_bucket" {
source = "./modules/s3-bucket"
name = "logs-prod"
tags = { Env = "prod" }
}Что использовать на практике
- Практика. типичные модули — "сеть" (VPC/подсети), "кластер БД", "сервис приложения"; при изменении логики внутри модуля достаточно поднять версию и обновить всех потребителей, а не редактировать копии кода в десяти местах.
Подводные камни
- Ошибка. делать модуль слишком узким (на один resource без добавленной логики) или слишком широким (один модуль "на всё"), из-за чего он становится негибким; забывать, что переменные без значения по умолчанию обязательны для вызывающего кода, и не документировать интерфейс модуля.