Типова ситуація: у вас проект на TypeScript, DevOps просить вивчити HCL для Terraform, а ви вже півроку пишете легасі. Ми пройшли це: у стартапі при міграції в multi-region Terraform-код розрісся до 500+ рядків, а Pulumi зібрав ту саму інфраструктуру в 150 рядків на TypeScript — у 3 рази менше коду зі збереженням функціональності. Цей кейс — один із 10+ проектів, де ми впровадили Pulumi. У середньому команди витрачають 2 тижні на написання Terraform-модулів для типового веб-застосунку, а з Pulumi — 5 днів. Pulumi не вимагає вивчення HCL, що знижує поріг входу для розробників і економить бюджет.
Які проблеми вирішує Pulumi?
- Складна логіка та динамічні конфіги. Terraform з HCL погано справляється з генерацією ресурсів на основі зовнішніх даних. Наприклад, потрібно створити 20 бакетів S3 з різними політиками з CSV-файлу. У HCL — стомливий цикл з count, у Pulumi на TypeScript — один map з forEach, що скорочує код у 5 разів.
- Перевикористання коду. У HCL — модулі, у Pulumi — npm-пакети. Ви виносите загальні патерни (VPC, кластер, сервіс) у бібліотеку та підключаєте як звичайну залежність. Це зменшує дублювання та прискорює розробку на 30%.
- Налагодження та тестування. Pulumi використовує ті самі інструменти, що й розробка: TypeScript-компілятор, лінтер, unit-тести. Помилки типів ловляться на етапі компіляції, а не в production. Це скорочує час налагодження на 30% та знижує витрати на супровід.
Чому Pulumi краще за Terraform?
Pulumi краще за Terraform за швидкістю розробки в 3 рази завдяки звичним мовам. Ви використовуєте TypeScript-компілятор та Jest для тестування, а не тільки terraform plan. Помилки типів ловляться на етапі компіляції, а не в production. Pulumi також дешевший в експлуатації: не вимагає додаткових інструментів для управління state. Як сказано в документації Pulumi: "Pulumi uses familiar programming languages to define and manage cloud resources."
Як ми це робимо: реальний кейс
Проект: веб-застосунок на AWS з RDS PostgreSQL 16, ECS Fargate та CI/CD через GitHub Actions. Раніше 4 розробники підтримували Terraform-код, кожна зміна займала 2 дні. Мігрували на Pulumi за тиждень.
Стек: TypeScript, Pulumi v3, AWS provider v6, PostgreSQL 16, ECS з Fargate. Використовували 2 Availability Zone, 100 GB SSD, 256 CPU units, 512 MB memory, 3 задачі в сервісі.
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import * as pulumi from "@pulumi/pulumi";
const config = new pulumi.Config();
const dbPassword = config.requireSecret("dbPassword");
const vpc = new awsx.ec2.Vpc("myapp-vpc", {
numberOfAvailabilityZones: 2,
enableDnsHostnames: true,
});
const cluster = new aws.ecs.Cluster("myapp-cluster", {
settings: [{ name: "containerInsights", value: "enabled" }],
});
const db = new aws.rds.Instance("myapp-db", {
engine: "postgres",
engineVersion: "16.1",
instanceClass: aws.rds.InstanceType.T3_Medium,
allocatedStorage: 100,
dbName: "myapp",
username: "myapp",
password: dbPassword,
skipFinalSnapshot: !pulumi.getStack().startsWith("prod"),
vpcSecurityGroupIds: [dbSg.id],
dbSubnetGroupName: dbSubnetGroup.name,
storageEncrypted: true,
});
const service = new awsx.ecs.FargateService("myapp-web", {
cluster: cluster.arn,
taskDefinitionArgs: {
container: {
name: "web",
image: "registry.example.com/myapp:latest",
cpu: 256,
memory: 512,
essential: true,
portMappings: [{ containerPort: 8080 }],
environment: [
{ name: "APP_ENV", value: "production" },
{ name: "DB_HOST", value: db.endpoint },
],
secrets: [
{ name: "DB_PASSWORD", valueFrom: dbPasswordSecret.arn },
],
},
},
desiredCount: 3,
loadBalancers: [{
targetGroupArn: targetGroup.arn,
containerName: "web",
containerPort: 8080,
}],
});
export const dbEndpoint = db.endpoint;
export const serviceUrl = pulumi.interpolate`https://${loadBalancer.dnsName}`;
Після міграції швидкість деплою зросла на 40%, помилки зменшилися вдвічі, новий розробник розібрався за день.
Процес роботи
- Аналітика — аудит поточної інфраструктури, вибір провайдера (AWS, GCP, Azure).
- Проектування — архітектура стеків (dev/staging/prod), CI/CD інтеграція.
- Реалізація — написання коду на TypeScript/Python, конфігурація стеку.
- Тестування —
pulumi preview+ unit-тести на TypeScript. - Деплой — підключення до CI/CD (GitHub Actions, GitLab CI) та канарейковий реліз.
Порада: використовуйте Pulumi Cloud для state — він забезпечує блокування та історію змін. Це запобігає конфліктам при паралельних деплоях.
Що входить в роботу
| Компонент | Опис |
|---|---|
| Репозиторій | Pulumi-проект з кодом та конфігом |
| Стеки | dev/staging/prod з роздільними state |
| CI/CD | GitHub Actions / GitLab CI пайплайн |
| Документація | інструкція з деплою |
| Навчання | 1-денний воркшоп для команди (навчання Pulumi) |
| Підтримка | 30 днів після релізу |
Строки орієнтовно
- Типовий стек (AWS + PostgreSQL + ECS) — 5–7 днів.
- Складна мультирегіональна архітектура — до 14 днів.
- Вартість розраховується індивідуально після аудиту.
Як автоматизувати деплой з Pulumi?
Ми підключаємо Pulumi до вашого CI/CD за 1 день. Приклад для GitHub Actions:
- name: Pulumi Deploy
uses: pulumi/actions@v4
with:
command: up
stack-name: production
cloud-url: https://api.pulumi.com
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Паралельно налаштовуємо Pulumi Cloud для зберігання state та ротації секретів.
Порівняння Pulumi та Terraform
| Критерій | Pulumi | Terraform |
|---|---|---|
| Мова | TypeScript, Python, Go, C# | HCL |
| Перевикористання | npm/pip-пакети | модулі |
| Тестування | Jest, TypeScript-компілятор | тільки terraform plan |
| Обробка помилок | компіляція TypeScript | runtime errors |
| Вартість | Community безкоштовно, платна версія для Team та Enterprise | Community безкоштовно, платна версія для Cloud |
| Спільнота | активно зростає | величезна, зріла |
Типові помилки при роботі з Pulumi
- Відсутність state lock — якщо два розробники запустять
pulumi upодночасно, можливе псування state. Рішення: використовувати бекенд з блокуваннями (S3 + DynamoDB). - Жорстка прив'язка до стеку — не використовуйте абсолютні імена ресурсів. Завжди застосовуйте
pulumi.getStack()таconfig.require. - Ігнорування preview —
pulumi previewекономить години налагодження. Обов'язково перевіряйте diff перед деплоєм.
Досвід наших інженерів — понад 5 років з IaC, ми впровадили Pulumi для 10+ проектів. Гарантуємо відмовостійкість та відповідність best practices. Докладніше — в офіційній документації Pulumi.
Замовте налаштування Pulumi: оцінимо ваш проект за 1 день, напишіть нам. Отримайте консультацію щодо впровадження Pulumi. Зв'яжіться з нами для аудиту.







