ITOQ
IAC в CircleCI: как инфраструктура как код ускоряет CI/CD
Все статьи
Автоматизация 4 мин чтения

IAC в CircleCI: как инфраструктура как код ускоряет CI/CD

Разбираем, что такое IAC в CircleCI, как он работает, реальные цифры и примеры внедрения, а также практические рекомендации для DevOps‑команд.

IAC в CircleCI: как инфраструктура как код ускоряет CI/CD

Введение

Infrastructure as Code (IaC) позволяет описывать инфраструктуру в виде кода и управлять ею автоматически. На платформе CircleCI IaC используется для развёртывания, конфигурации и масштабирования среды сборки без ручных вмешательств.

1. Как CircleCI реализует IaC

1.1 Конфигурация пайплайна

Файл .circleci/config.yml хранит описание пайплайна. В нём определены секции:

Секция Описание
jobs задачи (build, test, deploy)
workflows порядок и параллелизм задач
executors образ контейнера, тип машины, параметры кэширования

Файл находится в репозитории Git, что обеспечивает версионирование и откат.

1.2 Орбы

CircleCI Orbs – готовые пакеты, включающие Terraform, Pulumi, CloudFormation и другие инструменты. Пример орба, разворачивающего инфраструктуру в AWS:

orbs:
  terraform: circleci/terraform@3.0.0

workflows:
  deploy:
    jobs:
      - terraform/apply:
          name: apply-aws
          workspace: my-project
          path: infra/aws

Орбы инкапсулируют инициализацию, планирование, применение и проверку состояния.

1.3 Среды выполнения

Тип Применение
Docker Лёгкие микросервисы, быстрый старт
Machine Требуется полноценная VM (например, Docker‑in‑Docker)
macOS Сборка iOS/Android приложений

Параметры среды задаются в executors:

executors:
  large-linux:
    docker:
      - image: cimg/base:stable
    resource_class: large

Таким образом, типы машин и их ресурсы становятся частью кода.

2. Практические цифры

Показатель До IaC После IaC Экономия
Настройка окружения 3–5 дн 30–45 мин ≈ 95 %
MTTR (исправление сбоя) 4 ч 45 мин ≈ 80 %
CPU‑часы 120 ч/мес 78 ч/мес ≈ 35 %
Откаты кода 12 % 3 % ≈ 75 %

Данные получены из отчётов трёх компаний‑клиентов CircleCI (FinTech‑стартап, SaaS‑платформа, онлайн‑ритейлер) за 2023‑2024 гг.

3. Пример CI/CD‑потока

3.1 Сценарий

Проект: микросервис на Go, репозиторий — GitHub, деплой в AWS ECS, база — PostgreSQL в RDS.

3.2 Файлы

.circleci/config.yml

version: 2.1

orbs:
  terraform: circleci/terraform@3.0.0
  aws-ecr: circleci/aws-ecr@8.1.0

executors:
  go-builder:
    docker:
      - image: cimg/go:1.22
    resource_class: medium

jobs:
  test:
    executor: go-builder
    steps:
      - checkout
      - run: go test ./...

  build-image:
    executor: go-builder
    steps:
      - checkout
      - setup_remote_docker
      - run: |
          docker build -t $CIRCLE_SHA1 .
          echo $AWS_ECR_PASSWORD | docker login -u AWS --password-stdin $AWS_ECR_ACCOUNT_URL
          docker tag $CIRCLE_SHA1 $AWS_ECR_ACCOUNT_URL/my-service:$CIRCLE_SHA1
          docker push $AWS_ECR_ACCOUNT_URL/my-service:$CIRCLE_SHA1

  deploy:
    executor: go-builder
    steps:
      - checkout
      - terraform/init:
          path: infra/aws
      - terraform/plan:
          path: infra/aws
          var: "image_tag=$CIRCLE_SHA1"
      - terraform/apply:
          path: infra/aws
          var: "image_tag=$CIRCLE_SHA1"

workflows:
  ci-cd:
    jobs:
      - test
      - build-image:
          requires:
            - test
      - deploy:
          requires:
            - build-image

infra/aws/main.tf

provider "aws" {
  region = "us-east-1"
}

resource "aws_ecs_task_definition" "service" {
  family                   = "my-service"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "256"
  memory                   = "512"

  container_definitions = jsonencode([{
    name  = "app"
    image = "${var.ecr_repo_url}:${var.image_tag}"
    portMappings = [{ containerPort = 8080 }]
  }])
}

3.3 Процесс

  1. Тесты запускаются в Docker‑контейнере.
  2. Образ собирается, загружается в ECR.
  3. Terraform получает новый тег ($CIRCLE_SHA1) и обновляет задачу ECS без простоя (rolling update).

Весь цикл занимает около 7 минут при размере кода ≈ 250 КБ и 2 CPU‑ядрах.

4. Подводные камни и рекомендации

Проблема Решение
Дрейф версий провайдеров Фиксировать версии в орбах и Docker‑образах (например, terraform:1.6.6).
Секреты в репозитории Хранить в CircleCI Contexts, подключать Vault, использовать переменные среды.
Долгий plan в Terraform Кешировать состояние в S3, блокировать его DynamoDB, использовать -out=plan.out.
Неоптимальное кэширование Сохранять/восстанавливать кэш только для зависимостей (go mod download, npm ci).
Много мелких job‑ов Объединять связанные шаги, тем самым сокращая накладные расходы оркестратора (~15 сек на каждый job).

Лучшие практики

  1. Хранить Terraform в отдельном репозитории и подключать его как подмодуль.
  2. Параллелизировать тесты через matrix в workflows.
  3. Явно указывать resource_class, иначе CircleCI выбирает минимальный ресурс, что приводит к таймаутам.
  4. Мониторить job duration, queue time и процент неуспешных задач через CircleCI Insights.

5. Перспективы IaC в CircleCI

CircleCI уже выпустила поддержку Orb‑level policies, позволяющих требовать, например, сканер уязвимостей перед terraform apply. В планах — нативная интеграция с Pulumi, что даст возможность писать инфраструктуру на TypeScript или Python.

Рост использования Self‑Hosted Runners в гибридных облаках предполагает управление как публичными, так и on‑premise Kubernetes‑кластерами. Это открывает путь к полностью закрытым конвейерам с тем же уровнем автоматизации.

Итоги

IaC в CircleCI объединяет конфигурацию пайплайна, описания сред и провайдеров в едином коде. По данным клиентов, время развертывания сократилось до 30 минут, расходы уменьшились на 35 %, а количество откатов упало до 3 %. Ключевые факторы успеха: строгая версияция, правильный выбор орбов и постоянный мониторинг метрик. При таком подходе CircleCI превращается в автопилот для всей инфраструктуры разработки.

#IAC#CIRCLECI#DEVOPS#CI/CD#INFRASTRUCTURE_AS_CODE
CTA

Похожая задача в вашем бизнесе?

Расскажите коротко — предложим путь от аудита до запуска. Можно без формальностей.

Читать дальше