mirror of
https://gitlab.sarex.io/infra/terraform-contour-mirror.git
synced 2026-08-05 18:31:00 +03:00
| live | ||
| modules | ||
| scripts | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| Dockerfile | ||
| infrastructure.yaml | ||
| README.md | ||
Terraform Infrastructure
Infrastructure as Code для управления ресурсами Yandex Cloud и Kubernetes.
Структура
terraform/
├── infrastructure.yaml # Конфигурация всех ресурсов (единый источник правды)
├── live/ # Terragrunt конфигурации по окружениям
│ ├── terragrunt.hcl # Общие настройки (backend, providers)
│ └── stage/ # Stage окружение
│ ├── env.hcl
│ ├── namespace/
│ ├── database/
│ ├── s3/
│ └── secrets/
└── modules/ # Terraform модули
├── k8s-namespace/ # Создание Kubernetes namespaces
├── k8s-secret/ # Создание Kubernetes secrets (с зависимостями)
├── k8s-secrets/ # Простое создание secrets
├── yc-database/ # PostgreSQL users и databases в Yandex Cloud
└── yc-s3/ # S3 бакеты с изолированным доступом
Принцип работы
infrastructure.yaml
Единый файл конфигурации для всех ресурсов. Структура:
environments:
stage: # Имя окружения
namespaces: # Kubernetes namespaces
- name: pulse
labels: {}
annotations: {}
buckets: # S3 бакеты
- name: pulse-stage
acl: private
role: storage.uploader # опционально
versioning:
enabled: false
cors:
enabled: true
allowed_methods: [GET, PUT]
databases: # PostgreSQL databases
- cluster_id: "xxx"
database:
name: mydb
extensions: [pg_stat_statements]
user:
name: myuser
password_length: 32
conn_limit: 10
secrets: # Kubernetes secrets
- name: my-secret
namespace: pulse
type: database # database | s3 | dockerconfigjson | opaque
dependencies:
cluster: "xxx"
db: mydb
user: myuser
Terragrunt
Terragrunt читает infrastructure.yaml и передаёт данные в модули:
locals {
infra_config = yamldecode(file("${local.repo_root}/infrastructure.yaml"))
env_config = local.infra_config.environments[local.env_name]
}
inputs = {
buckets = local.env_config.buckets
}
Порядок применения
Модули имеют зависимости и применяются в порядке:
namespace → database → s3 → secrets
Модули
yc-s3
Создание S3 бакетов с изолированным доступом.
Особенности:
- Каждый бакет получает отдельный Service Account
- SA не имеет глобальных IAM ролей на storage на уровне folder
- Доступ к бакету через IAM binding (
yandex_storage_bucket_iam_binding) - SA может работать только со своим бакетом
Роли (Yandex Cloud IAM):
storage.uploader(default) — загрузка объектовstorage.viewer— чтение объектовstorage.editor— полный доступ
Пример:
buckets:
- name: my-bucket
acl: private
role: storage.uploader # опционально
yc-database
Создание PostgreSQL users и databases в существующем кластере.
Особенности:
- Пароль генерируется автоматически
- Поддержка extensions
- Поддержка permissions на другие БД
ignore_changesна password
Пример:
databases:
- cluster_id: "c9qa2coo5ukgcg93fldm"
database:
name: mydb
extensions: [pg_stat_statements]
user:
name: myuser
password_length: 32
conn_limit: 10
permissions: [other_db]
k8s-secret
Создание Kubernetes secrets с поддержкой зависимостей.
Типы секретов:
database— host, port, database, username, password, ca.crts3— access_key, secret_key, bucket, endpointdockerconfigjson— credentials для container registryopaque— произвольные данные
Особенности:
- Автоматическое получение данных из database/s3 модулей
- Поддержка
random_keysдля генерации паролей - Поддержка
custom_keysдля статических значений ignore_changesдля предотвращения перезаписи
Пример:
secrets:
- name: my-db-secret
namespace: pulse
type: database
dependencies:
cluster: "c9qa2coo5ukgcg93fldm"
db: mydb
user: myuser
random_keys:
session_key:
length: 32
special: false
lifecycle:
ignore_changes: true
k8s-namespace
Создание Kubernetes namespaces.
Пример:
namespaces:
- name: pulse
labels:
environment: stage
annotations:
managed-by: terraform
Использование
Локальный запуск
cd terraform/live/stage/s3
terragrunt init
terragrunt plan
terragrunt apply
Применение всех модулей
cd terraform/live/stage
terragrunt run-all plan
terragrunt run-all apply
Переменные окружения
export YC_TOKEN="..." # IAM токен (или YC_SERVICE_ACCOUNT_KEY_FILE)
export YC_CLOUD_ID="..."
export YC_FOLDER_ID="..." # Default folder
export YC_STAGE_FOLDER_ID="..." # Stage folder (опционально)
export KUBECONFIG="~/.kube/config"
export KUBE_CONTEXT="stage"
export S3_ACCESS_KEY="..." # Для terraform state
export S3_SECRET_KEY="..."
export DOCKER_REGISTRY_USERNAME="..." # Для dockerconfigjson secrets
export DOCKER_REGISTRY_PASSWORD="..."
CI/CD
Pipeline автоматически:
- Читает изменённые файлы
- Определяет затронутые модули
- Запускает
terragrunt plan/terragrunt apply
Требования
- Terraform >= 1.0
- Terragrunt >= 0.45
- Yandex Cloud провайдер ~> 0.100
- IAM токен с правами
storage.adminдля создания бакетов и bucket policy