- Add infrastructure.yaml as single source of truth (like values.yaml in Helm) - Make all modules universal (no hardcoded entity names) - Use existing PostgreSQL cluster instead of creating new one - Add yc-database module for working with existing PostgreSQL - Add k8s-secret module with lifecycle.ignore_changes support - Update terragrunt.hcl files to read from infrastructure.yaml - Remove scripts, use native Terragrunt functions (yamldecode)
6.0 KiB
Terraform Infrastructure for Pulse Project
Этот репозиторий содержит инфраструктуру как код (IaC) для проекта Pulse, развернутого в Yandex Cloud.
Архитектура
Проект использует единый конфигурационный файл infrastructure.yaml (аналог values.yaml в Helm), который описывает всю инфраструктуру декларативно. Модули Terraform универсальны и не знают про конкретные сущности - они используются для создания ресурсов, описанных в конфиге.
Структура репозитория
.
├── infrastructure.yaml # Единый конфигурационный файл (аналог values.yaml)
├── modules/ # Универсальные Terraform модули
│ ├── yc-s3/ # Модуль для создания S3 бакета
│ ├── yc-database/ # Модуль для работы с существующим PostgreSQL
│ ├── k8s-namespace/ # Модуль для создания Kubernetes namespace
│ └── k8s-secret/ # Модуль для создания Kubernetes секретов
└── live/ # Живая инфраструктура
├── terragrunt.hcl # Глобальная конфигурация Terragrunt
└── stage/ # Окружение stage
├── env.hcl # Конфигурация окружения
├── namespace/ # Namespace из конфига
├── s3/ # S3 бакет из конфига
├── database/ # База данных из конфига
└── secrets/ # Секреты из конфига
Конфигурационный файл
Все ресурсы описываются в infrastructure.yaml:
environments:
stage:
namespaces:
- name: pulse
labels: {}
annotations: {}
secrets:
- name: dockerhub
namespace: pulse
type: dockerconfigjson
# ...
buckets:
- name: pulse
acl: public-read
# ...
databases:
- cluster_id: pg-stage # ID существующего кластера
database:
name: pulse_db
user:
name: pulse
password_length: 32
Каждый terragrunt.hcl читает этот конфиг через yamldecode(file(...)) и извлекает нужные параметры.
Модули
Все модули универсальны и не содержат хардкода про конкретные сущности:
- yc-s3 - создает S3 бакет с любыми параметрами из конфига
- yc-database - работает с существующим PostgreSQL кластером, создает БД и пользователя
- k8s-namespace - создает namespace с любыми labels/annotations
- k8s-secret - создает секреты с поддержкой
lifecycle.ignore_changes
Особенности
Секреты с защитой от перезаписи
Секреты могут быть настроены с lifecycle.ignore_changes: true, чтобы не перезаписываться после создания:
secrets:
- name: pulse-s3-secret
lifecycle:
ignore_changes: true
Использование существующего PostgreSQL
Модуль yc-database работает с существующим кластером PostgreSQL в Yandex Cloud. Он только создает базу данных и пользователя, не создавая новый кластер.
Зависимости между ресурсами
Terragrunt автоматически управляет зависимостями через блоки dependency. Например, секреты зависят от namespace, s3 и database, и получают их outputs.
Использование
Локальная разработка
- Отредактируйте
infrastructure.yamlдля добавления/изменения ресурсов - Перейдите в директорию компонента:
cd live/stage/namespace
- Инициализируйте Terragrunt:
terragrunt init
- Просмотрите план:
terragrunt plan
- Примените изменения:
terragrunt apply
Развертывание всех компонентов
cd live/stage
terragrunt run-all apply
Переменные окружения
YC_TOKEN- токен Yandex CloudYC_CLOUD_ID- ID облакаYC_FOLDER_ID/YC_STAGE_FOLDER_ID- ID каталогаDOCKER_REGISTRY_USERNAME/DOCKER_REGISTRY_PASSWORD- для секрета dockerhubTF_STATE_BUCKET- бакет для хранения stateTF_STATE_DYNAMODB_ENDPOINT/TF_STATE_DYNAMODB_TABLE- для блокировок state
GitLab CI
Проект использует динамическую генерацию GitLab CI пайплайнов через downstream pipelines. Для каждого компонента создаются джобы: validate, plan, apply.
Принципы
- DRY - вся конфигурация в одном файле
infrastructure.yaml - Универсальность - модули не знают про конкретные сущности
- Декларативность - описание желаемого состояния, а не шагов
- Идемпотентность - повторный запуск безопасен
- Изоляция - каждый компонент имеет свой state