kb/modules
Модуль, переиспользуемый кусок HCL с контрактом из input variables и output values. Источники (local, git, registry, archive, S3), версионные ограничения, композиция модулей, передача провайдеров, всё что нужно чтобы превратить копипасту в библиотеку инфраструктуры.
`source` определяет откуда terraform берёт код модуля. Пять основных типов: локальный путь (`./modules/x`), git-репо (`git::https://...`), Terraform Registry (`hashicorp/consul/aws`), архив (`https://.../v1.0.zip`), S3-объект (`s3::https://...`). Local, для своего репо. Registry, для публичных модулей. Git, для приватных.
Модуль может вызывать другие модули, внутри своего main.tf через тот же `module` блок. Адрес в state становится `module.A.module.B.<тип>.<имя>`. Провайдеры наследуются по умолчанию, но при нескольких alias'ах (multi-region, multi-account): передаются явно через `providers = { aws = aws.eu }`. `for_each` над модулем работает с TF 0.13+.
Снаружи модуль виден только через input variables (что принимает) и output values (что отдаёт). Всё остальное, детали реализации. Хороший модуль скрывает ресурсы за этим контрактом так, чтобы можно было переписать тело без изменения вызовов в root-модуле.