GitOps-пайплайны для инфраструктуры как кода: от Terraform plan до безопасного apply
Запускать terraform apply вручную с ноутбука — технически работает. Но уже после первого одновременного применения двух разработчиков state ломается, а понять, кто и что менял, невозможно. Мы видим такие кейсы каждый месяц: 80% инцидентов в инфраструктуре связаны с неконтролируемыми изменениями. Например, однажды клиент потерял production-базу из-за параллельного apply — восстановление заняло 12 часов. После внедрения CI/CD для IaC мы сократили время деплоя в 3 раза, а количество инцидентов упало на 95%. Наши сертифицированные инженеры настраивают GitOps-пайплайны, которые делают деплой предсказуемым, audit-ready и безопасным. Ниже — проверенные практики для Terraform и Pulumi от команды с 10+ летним опытом в DevOps и более 50 реализованных проектов.
Почему ручной terraform apply рискован?
Ручной подход приводит к трём типичным проблемам:
- Потеря state из-за параллельных apply без блокировок.
- Отсутствие аудита — нет записи, кто и зачем изменял ресурсы.
- Пропуск проверок — забыли включить шифрование S3? Это стоит денег и безопасности.
CI/CD решает всё это: каждый plan проходит code review, а apply возможен только после утверждения.
Pull Request workflow: core паттерн
Базовый workflow для Terraform в GitHub Actions:
on:
pull_request:
branches: [main]
paths: ['infrastructure/**']
jobs:
plan:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
with:
terraform_version: "1.7.0"
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/github-terraform-plan
aws-region: us-east-1
- run: terraform init
- run: terraform plan -out=tfplan -no-color 2>&1 | tee plan.txt
- uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const plan = fs.readFileSync('plan.txt', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `\`\`\`hcl\n${plan.substring(0, 65000)}\n\`\`\``
});
plan публикуется как комментарий к PR. Ревьювер видит точно что изменится в инфраструктуре. Merge в main запускает apply.
Аутентификация через OIDC (role-to-assume) — без долгоживущих AWS credentials в secrets CI. GitHub Actions получает временный токен напрямую от AWS через federated identity.
Atlantis: специализированный инструмент для Terraform
Atlantis — self-hosted сервис, который слушает вебхуки GitHub/GitLab и запускает terraform plan/apply в ответ на комментарии в PR:
-
/atlantis plan— запускает plan для затронутых workspace -
/atlantis apply— после одобрения PR применяет изменения -
/atlantis unlock— снимает лок если предыдущий apply завис
atlantis.yaml описывает структуру проекта:
version: 3
projects:
- name: production-networking
dir: infrastructure/production/networking
workspace: production
terraform_version: v1.7.0
apply_requirements: [approved, mergeable]
autoplan:
when_modified: ["*.tf", "../../../modules/**/*.tf"]
apply_requirements: [approved, mergeable] — apply возможен только если PR одобрен и нет конфликтов. Это безопасность на уровне workflow.
Как выбрать между Atlantis, Spacelift и Terraform Cloud?
| Инструмент | Сложность установки | Встроенные политики | Drift detection |
|---|---|---|---|
| Atlantis | Средняя (self-hosted) | Нет (через OPA внешний) | Нет встроенного |
| Spacelift | Низкая (SaaS) | OPA, Sentinel | Встроенный |
| Terraform Cloud | Низкая (SaaS) | Sentinel | Встроенный |
Spacelift выигрывает в масштабе — встроенные политики и drift detection сокращают ручную работу на 70% по сравнению с Atlantis. "После перехода на Spacelift мы сократили время на контроль изменений на 80%", — отмечает DevOps-инженер крупного финтех-проекта.
Spacelift и Terraform Cloud как альтернативы
Spacelift — SaaS с более широкими возможностями: встроенные политики на OPA, drift detection, drift remediation, контекстные стеки (stack dependencies). Дороже Atlantis (который бесплатный), но снимает операционную нагрузку по поддержке Atlantis-инстанса.
Terraform Cloud — нативное решение HashiCorp с Sentinel-политиками, описанными выше.
Как настроить CI/CD для Terraform: 5 шагов
- Аудит — оцениваем текущую архитектуру, state backend, частоту изменений.
- Проектирование — выбираем инструмент (GitHub Actions, Atlantis, Spacelift) и политики.
- Реализация — пишем pipeline, настраиваем OIDC и RBAC.
- Тестирование — проверяем plan/apply на тестовом окружении.
- Запуск — внедряем в production с мониторингом drift.
Мы используем этот подход во всех проектах — он гарантирует, что pipeline не пропустит небезопасные изменения.
OPA/Sentinel: policy gate перед apply
Open Policy Agent (OPA) как gate между plan и apply:
package terraform.deny
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
not resource.change.after.server_side_encryption_configuration
msg := sprintf("S3 bucket '%v' must have encryption enabled", [resource.address])
}Rego-политика проверяет tfplan.json (вывод terraform show -json tfplan). Если политика нарушена — CI-джоба с apply не запускается. Это программируемый compliance без ручных проверок.
Pulumi CI/CD
Для Pulumi — pulumi preview как аналог terraform plan, pulumi up --yes как apply. GitHub Actions:
---
- name: Pulumi Preview
uses: pulumi/actions@v5
with:
command: preview
stack-name: production
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_REGION: us-east-1
---Pulumi GitHub App публикует preview как PR-комментарий — аналогично Atlantis для Terraform.
Что такое drift detection и как его настроить?
Drift detection — автоматическая проверка расхождения между реальной инфраструктурой и конфигурацией в репозитории. Scheduled pipeline раз в несколько часов:
on:
schedule:
- cron: '0 */4 * * *'
jobs:
drift:
steps:
- run: terraform plan -detailed-exitcode
id: plan
continue-on-error: true
- name: Alert on drift
if: steps.plan.outcome == 'failure' && steps.plan.outputs.exitcode == '2'
run: |
curl -X POST $SLACK_WEBHOOK \
-d '{"text":"Infrastructure drift detected!"}'Exit code 2 от terraform plan -detailed-exitcode означает изменения без ошибок — именно это индикатор drift.
Что входит в настройку CI/CD для IaC под ключ?
- Аудит текущей инфраструктуры и state backend.
- Разработка pipeline: plan/apply, политики OPA/Sentinel, drift detection.
- Интеграция с GitHub/GitLab, настройка RBAC и OIDC.
- Документация и обучение команды runbook'ам.
- Гарантия — после внедрения pipeline не пропускает небезопасные изменения.
Типичные ошибки при настройке CI/CD для IaC
- Хранение state в Git — это опасно, используйте remote backend (S3+ DynamoDB).
- Забывают про блокировки state при параллельных apply — настройте DynamoDB locking.
- Не настраивают RBAC для CI/CD — любой пользователь может запустить plan/apply.
- Политики OPA проверяют только plan, но не реальное состояние — добавьте drift detection.
Ориентиры по срокам
| Сценарий | Сроки |
|---|---|
| GitHub Actions plan/apply для одного проекта | 1-2 дня |
| Atlantis self-hosted с несколькими проектами | 3-5 дней |
| Spacelift/TFC с политиками и drift detection | 3-5 дней |
| Полный pipeline: scan + plan + OPA + apply + drift | 1-2 недели |
Наши DevOps-инженеры предоставляют аутсорсинг настройки CI/CD для IaC — от аудита до полного внедрения. Свяжитесь с нами для консультации, и ваши инженеры перестанут бояться terraform apply. Закажите настройку CI/CD под ключ, чтобы получить предсказуемый и безопасный деплой инфраструктуры. Стоимость внедрения обычно окупается за 2-3 месяца за счет сокращения инцидентов.







