
Введение
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 Процесс
- Тесты запускаются в Docker‑контейнере.
- Образ собирается, загружается в ECR.
- 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). |
Лучшие практики
- Хранить Terraform в отдельном репозитории и подключать его как подмодуль.
- Параллелизировать тесты через
matrixвworkflows. - Явно указывать
resource_class, иначе CircleCI выбирает минимальный ресурс, что приводит к таймаутам. - Мониторить
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 превращается в автопилот для всей инфраструктуры разработки.
Похожая задача в вашем бизнесе?
Расскажите коротко — предложим путь от аудита до запуска. Можно без формальностей.


