Terraform — модули и структура репозитория
Базовый цикл CLI — практический путь; справочник HCL — 3.md.
Модули и layout репозитория
Одна папка с .tf-файлами — уже модуль (корневой). Сила Terraform — вызов модуля из другого модуля: один раз описали VPC или web-кластер, переиспользуете в stage и prod с разными параметрами.
Структура modules/ + live/
infrastructure/
├── modules/
│ ├── networking/vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ └── services/webserver-cluster/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── live/
├── stage/
│ ├── networking/vpc/
│ │ ├── main.tf # module "vpc" { source = "../../../modules/..." }
│ │ ├── backend.tf
│ │ └── terraform.tfvars
│ └── services/webserver-cluster/
│ ├── main.tf
│ └── backend.tf
└── prod/
└── ... # те же модули, другие tfvars и backend key
Разбор:
modules/— переиспользуемая логика; изменение модуля влияет на все окружения после bump версии.live/— тонкие «обёртки»: вызов модулей, backend, значения переменных для конкретного env.- Отдельный state на стек (
live/stage/.../terraform.tfstate) — изоляция:applyв stage не трогает prod.
Вызов модуля
module "webserver_cluster" {
source = "../../../modules/services/webserver-cluster"
cluster_name = "web-stage"
instance_count = 2
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.public_subnet_ids
}
variables.tf модуля объявляет контракт; outputs.tf экспортирует URL ALB, ID target group и т.д.
Провайдер только в root
В переиспользуемом модуле блок provider "aws" убирают. Настройка region, alias и credentials — в live/.../main.tf. Иначе модуль жёстко привязан к одному аккаунту/региону и его нельзя переиспользовать.
Для нескольких регионов или аккаунтов — provider "aws" { alias = "replica" } в root и providers = { aws = aws.replica } в module.
Связь стеков через remote state
Стек «сеть» публикует outputs; стек «приложение» читает их без дублирования ID:
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "my-company-terraform-state"
key = "stage/networking/vpc/terraform.tfstate"
region = "eu-central-1"
}
}
resource "aws_instance" "app" {
subnet_id = data.terraform_remote_state.network.outputs.public_subnet_ids[0]
}
Разбор:
- Порядок apply: сначала VPC-стек, затем зависимые сервисы.
- Контракт между командами — outputs VPC-модуля; breaking change output = координация релизов.
Версионирование модулей
| Источник | Пример source | Когда |
|---|---|---|
| Локальный путь | source = "../../../modules/vpc" | Monorepo, быстрая итерация |
| Git | source = "git::https://...?ref=v1.2.0" | Внутренняя библиотека модулей |
| Registry | source = "terraform-aws-modules/vpc/aws" + version = "5.0.0" | Community modules |
Pin версии модуля в prod; обновление — отдельный PR с diff плана.
Terragrunt (кратко)
Terragrunt — обёртка для DRY: общий backend и provider в родительских terragrunt.hcl, в листьях live/ только terraform { source = ... }. Имеет смысл при десятках однотипных стеков; для маленькой команды достаточно copy-paste backend.tf в каждом live-каталоге. См. справочник — Terragrunt.
См. также
- Terraform — практический путь — до выноса в модули.
- Terraform — workspaces, count/for_each.
- Тестирование Terraform — проверка модулей.
- Terraform в команде — CI для
live/стеков.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Часто можно запутаться в понятиях вроде прод, тест и тому подобное — основы DevOps простым языком. Непрерывная интеграция — это практика разработки программного обеспечения, при которой изменения, вносимые разработчиками в общий репозиторий исходного кода, автоматически и регулярно объединяются. Развёртывание — доставка новой версии на сервер; стратегия — правила, как переключить пользователей со старой версии на новую без простоя и с откатом. Git — точка входа в CI/CD: коммит, ветка и pull request запускают сборку, тесты и выкат; ниже — Git Flow, хуки и GitOps. Approvals и deployment gates в GitHub Actions и Azure Pipelines: разделение зон ответственности между разработкой и эксплуатацией. Пайплайн — цепочка от планирования и коммита до мониторинга на проде: CI (сборка, тесты), CD (релиз, деплой) и типичные инструменты этапов. Azure Repos — Git и TFVC в Azure DevOps: репозитории, pull request, политики веток и связь с CI/CD. Автоматизация и наблюдаемость - стек ELK для сбора, индексации и анализа логов (Elasticsearch, Logstash, Kibana). Смешение терминов системный администратор и DevOps-инженер — чем роли отличаются на практике. Автоматизация представляет собой систематическое применение программных и аппаратных средств для выполнения задач без или с минимальным участием человека. Логирование и мониторинг в CI/CD необходимы для автоматизации процессов и обеспечения качества, позволяя отслеживать ход пайплайна и быстро выявлять проблемы. Terraform — это программа, которая позволяет описать всю вашу инфраструктуру в текстовых файлах, а потом одной командой создать её в облаке или локально.Основы DevOps
CI/CD. Принципы непрерывной интеграции и доставки
Стратегии развертывания
Использование Git и GitFlow в DevOps-процессах
Особенности настройки и эксплуатации CI/CD-конвейеров
Жизненный цикл пайплайна CI/CD
Azure Repos и Team Foundation Server (TFS)
Инструменты автоматизации и оркестрации
Роль DevOps-инженера и отличия от системного администратора
Автоматизация сборки, тестирования и развёртывания
Логирование, мониторинг и наблюдаемость систем
Terraform