🏗️ Terraform Modules
Структура модулей, Registry, переиспользуемые компоненты
📦 Что такое Module?
Набор Terraform-файлов — переиспользуемый компонент инфраструктуры. Root module — основная рабочая директория. Child module — вызывается через блок `module`. Published modules: Terraform Registry (registry.terraform.io).
🏗️ Структура Module
main.tf — основные ресурсы. variables.tf — входные переменные. outputs.tf — выходные значения. versions.tf — required_providers. README.md — документация. Это стандартная структура.
📡 Источники Module
Локальный путь: `"./modules/vpc"`. Terraform Registry: `"hashicorp/consul/aws"`. GitHub: `"github.com/org/repo//modules/vpc"`. S3: `"s3::https://..."`. Версионирование модулей: `version = "~> 3.0"` (для модулей из Registry).
🔄 Лучшие практики Module
- Один модуль — одна задача (single responsibility)
- Добавляйте валидацию входных переменных
- Экспортируйте все outputs
- Публикуйте с использованием семантического версионирования
- Модули могут быть вложенными (module внутри module)
💡 Ключевые моменты
- Module: переиспользуемый компонент Terraform
- Root module: основная рабочая директория
- module "name" { source = "..." } — вызов модуля
- variables.tf, outputs.tf, main.tf — стандартная структура
- Registry modules: фиксируйте `version`
- Вывод модуля: module.NAME.output_name
📋 Пример кода
# Module chaqirish
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
enable_nat_gateway = true
}
# Module outputidan foydalanish
resource "aws_instance" "app" {
subnet_id = module.vpc.private_subnets[0]
# ...
}
# Local module
module "database" {
source = "./modules/rds"
db_name = "myapp"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
}
🎯 Советы для экзамена
- При добавлении нового источника модуля необходимо повторно запустить `terraform init` — для загрузки провайдера/модуля
- Вложенность модулей: внутри module можно вызвать другой module, однако глубокая вложенность увеличивает сложность
- Приватный реестр модулей: хранение внутренних модулей в Terraform Cloud/Enterprise
- Версионирование доступно только для Registry modules; для модулей с локальным путём версия не указывается
- Если output модуля имеет `sensitive = true`, он остаётся sensitive и в родительском модуле
⚠️ Частые ошибки
- Забыть запустить `terraform init` после обновления модуля — новый модуль не будет загружен
- Путаница между root module и child module: root = директория, где запускается `terraform`, child = вызванный через блок `module`
- Попытка получить значение из модуля без outputs.tf — если значение не объявлено в outputs.tf, родительский модуль его не увидит
🧠 Для запоминания: "Module = Lego Block": переиспользуется, можно комбинировать, стандартный интерфейс (variables + outputs). "MOVE = Main, Outputs, Variables, Existing-data (data.tf)"
Проверьте себя по теме «Terraform Modules»
Бесплатные интерактивные тесты, пробный экзамен и полные уроки — на платформе CertMaster.
Начать бесплатно →