Pulumi vs Terraform у 2026: Infrastructure as Code з TypeScript та Питання для Співбесіди
Порівняння Pulumi та Terraform у 2026 році. Інфраструктура як код з TypeScript, керування станом та питання для співбесіди DevOps.

Pulumi vs Terraform представляє центральне рішення щодо інфраструктури як коду для команд DevOps у 2026 році. Обидва інструменти декларативно створюють хмарні ресурси, але відрізняються підтримкою мов, керуванням станом та зрілістю екосистеми. Це порівняння охоплює технічні компроміси, приклади коду на TypeScript та HCL, а також питання для співбесіди, що виникають при обговоренні вибору IaC.
Це порівняння використовує Pulumi v3.263.0 (випущений 15 вересня 2026) та Terraform 1.16.3 (випущений 26 серпня 2026). CDKTF, шар TypeScript від HashiCorp для Terraform, був визнаний застарілим у грудні 2025 року та архівований.
Базова Архітектура: Рушій Pulumi vs Цикл Plan-Apply Terraform
Terraform використовує доменно-специфічну мову (HCL) та двофазний робочий процес: terraform plan генерує план виконання, terraform apply його виконує. Файл стану відстежує метадані ресурсів і зберігається локально або у віддалених бекендах, таких як S3 чи Terraform Cloud.
Pulumi вбудовує свій рушій у середовища виконання мов загального призначення. Програми, написані на TypeScript, Python, Go або C#, виконуються безпосередньо проти хмарних API через провайдерів Pulumi. Стан за замовчуванням зберігається в Pulumi Cloud, з можливістю самостійно керованих бекендів, включаючи S3, Azure Blob Storage та локальні файли.
Архітектурна різниця проявляється одразу в тому, як кожен інструмент обробляє цикли, умови та абстракції. for_each та count у Terraform працюють в межах обмежень HCL. Програми Pulumi використовують нативні мовні конструкції: for...of у TypeScript, list comprehensions у Python, range у Go.
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
// Native TypeScript array methods work directly
const environments = ["dev", "staging", "prod"];
const buckets = environments.map(env =>
new aws.s3.BucketV2(`data-${env}`, {
bucket: `myapp-data-${env}-${pulumi.getStack()}`,
tags: {
Environment: env,
ManagedBy: "pulumi",
},
})
);
// Export bucket ARNs as stack outputs
export const bucketArns = buckets.map(b => b.arn);Еквівалентна конфігурація Terraform вимагає синтаксису HCL для ітерації:
# main.tf - Terraform HCL example
variable "environments" {
type = list(string)
default = ["dev", "staging", "prod"]
}
resource "aws_s3_bucket" "data" {
for_each = toset(var.environments)
bucket = "myapp-data-${each.key}-${terraform.workspace}"
tags = {
Environment = each.key
ManagedBy = "terraform"
}
}
output "bucket_arns" {
value = [for b in aws_s3_bucket.data : b.arn]
}Обидва фрагменти коду створюють три S3 бакети. Версія Terraform лаконічна та зрозуміла для всіх, хто знайомий з HCL. Версія Pulumi використовує стандартний TypeScript, що означає автодоповнення IDE, перевірку типів та інтеграцію з існуючими кодовими базами без вивчення нової мови.
Підтримка TypeScript: Нативна Мова vs CDKTF (Застарілий)
Pulumi підтримує TypeScript з першого публічного релізу. SDK надає типізовані класи ресурсів, а pulumi.Output<T> обгортає асинхронні значення, які розв'язуються під час розгортання. Інструменти рефакторингу, лінтери та фреймворки тестування з екосистеми TypeScript застосовуються безпосередньо.
Відповіддю Terraform на підтримку мов загального призначення був CDKTF (Cloud Development Kit for Terraform). CDKTF дозволяв командам писати TypeScript або Python, які компілювалися в Terraform JSON. HashiCorp визнав CDKTF застарілим у грудні 2025 року та архівував репозиторій. Існуючі проекти CDKTF все ще працюють, але оновлення для нових версій Terraform чи змін провайдерів не випускаються.
Для команд, які хочуть використовувати TypeScript IaC у 2026 році, Pulumi є активно підтримуваним варіантом. Команди, які інвестували в CDKTF, можуть продовжувати запускати свої стеки, але міграція на HCL або Pulumi є шляхом вперед для нової розробки.
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
// Custom component encapsulating VPC, subnets, and routing
export class StandardVpc extends pulumi.ComponentResource {
public readonly vpcId: pulumi.Output<string>;
public readonly publicSubnetIds: pulumi.Output<string>[];
constructor(name: string, args: { cidr: string; azCount: number }, opts?: pulumi.ComponentResourceOptions) {
super("mycompany:network:StandardVpc", name, {}, opts);
const vpc = new aws.ec2.Vpc(`${name}-vpc`, {
cidrBlock: args.cidr,
enableDnsHostnames: true,
tags: { Name: name },
}, { parent: this });
this.vpcId = vpc.id;
// Create public subnets across availability zones
const azs = aws.getAvailabilityZones({ state: "available" });
this.publicSubnetIds = [];
for (let i = 0; i < args.azCount; i++) {
const subnet = new aws.ec2.Subnet(`${name}-public-${i}`, {
vpcId: vpc.id,
cidrBlock: `10.0.${i}.0/24`,
availabilityZone: azs.then(az => az.names[i]),
mapPublicIpOnLaunch: true,
tags: { Name: `${name}-public-${i}` },
}, { parent: this });
this.publicSubnetIds.push(subnet.id);
}
this.registerOutputs({ vpcId: this.vpcId });
}
}Цей компонент Pulumi створює багаторазову абстракцію VPC. Користувачі інстанціюють його через new StandardVpc("prod", { cidr: "10.0.0.0/16", azCount: 3 }). Еквівалент у Terraform - це директорія модуля зі змінними, виходами та файлами HCL. Обидва підходи забезпечують повторне використання; версія Pulumi успадковує інструменти TypeScript для документації, тестування та версіонування.
Керування Станом та Опції Бекендів
Керування станом - це сфера, де з'являються операційні відмінності. Стан Terraform містить ідентифікатори ресурсів, метадані провайдерів та чутливі значення. Команди повинні налаштувати віддалені бекенди для забезпечення співпраці та реалізувати блокування для запобігання одночасних модифікацій.
Конфігурація бекенду Terraform підтримує S3, Azure Blob, Google Cloud Storage, Terraform Cloud та інші. Кожен бекенд вимагає власного налаштування автентифікації. Блокування стану використовує DynamoDB для бекендів S3, оренду блобів для Azure або нативне блокування в Terraform Cloud.
Pulumi Cloud за замовчуванням обробляє зберігання стану, блокування та історію. Команди створюють безкоштовний акаунт, запускають pulumi login, і керування станом налаштовано. Для команд, які потребують самостійно керованого стану, Pulumi підтримує бекенди S3, Azure Blob, GCS та локальні файли через команду pulumi login.
# Pulumi: login to self-managed S3 backend
pulumi login s3://my-pulumi-state-bucket
# Terraform: configure S3 backend in HCL
# backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}Pulumi Cloud надає веб-інтерфейс для історії стеків, візуалізації ресурсів та дозволів команди. Terraform Cloud пропонує схожі функції з примусовим виконанням політик через Sentinel. Варіанти самостійного хостингу існують для обох: самостійно розміщений бекенд Pulumi та Terraform Enterprise.
Готовий до співбесід з DevOps?
Практикуйся з нашими інтерактивними симуляторами, flashcards та технічними тестами.
Екосистема Провайдерів та Підтримка Multi-Cloud
Екосистема провайдерів Terraform є найбільшою в IaC. Terraform Registry містить понад 4000 провайдерів, що охоплюють AWS, Azure, GCP, Kubernetes та сотні SaaS платформ. Якість провайдерів варіюється: офіційні провайдери HashiCorp та хмарних постачальників отримують регулярні оновлення, тоді як провайдери спільноти можуть відставати від змін API.
Провайдери Pulumi обгортають провайдерів Terraform за допомогою моста, який генерує типізовані SDK. Pulumi Registry надає провайдерів для основних хмар, Kubernetes, баз даних та сервісів моніторингу. Оскільки Pulumi використовує міст для провайдерів Terraform, охоплення екосистеми порівнянне, хоча нові версії провайдерів Terraform вимагають оновлення моста перед тим, як SDK Pulumi відобразять зміни.
Pulumi також пропонує нативних провайдерів, написаних безпосередньо проти хмарних API. Нативні провайдери для AWS, Azure та Kubernetes забезпечують підтримку нових функцій API в той самий день. Компроміс полягає в тому, що нативні провайдери існують лише для основних хмар; менш поширені сервіси використовують провайдерів на основі моста.
// Using Pulumi's native AWS provider for Lambda
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
const role = new aws.iam.Role("lambda-role", {
assumeRolePolicy: aws.iam.assumeRolePolicyForPrincipal({
Service: "lambda.amazonaws.com",
}),
});
const lambdaFunction = new aws.lambda.Function("api-handler", {
runtime: aws.lambda.Runtime.NodeJS20dX,
handler: "index.handler",
role: role.arn,
code: new pulumi.asset.AssetArchive({
"index.js": new pulumi.asset.StringAsset(
`exports.handler = async () => ({ statusCode: 200, body: "OK" });`
),
}),
});
export const functionArn = lambdaFunction.arn;Тестування Коду Інфраструктури
Тестування - це сфера, де вибір мови створює розбіжності. Програми Pulumi є стандартним кодом, тому юніт-тести використовують знайомі фреймворки. Модуль @pulumi/pulumi/runtime забезпечує мокування для створення ресурсів, дозволяючи тестам перевіряти конфігурацію без розгортання ресурсів.
import { describe, it, expect, beforeAll } from "vitest";
import * as pulumi from "@pulumi/pulumi";
// Mock Pulumi runtime
pulumi.runtime.setMocks({
newResource: (args: pulumi.runtime.MockResourceArgs) => {
return { id: `${args.name}-id`, state: args.inputs };
},
call: (args: pulumi.runtime.MockCallArgs) => {
return args.inputs;
},
});
describe("S3 Bucket Configuration", () => {
let bucketTags: Record<string, string>;
beforeAll(async () => {
// Import the Pulumi program after mocks are set
const infra = await import("../infra/index");
// Extract outputs for testing
bucketTags = await new Promise(resolve => {
infra.buckets[0].tags.apply(tags => resolve(tags as Record<string, string>));
});
});
it("should tag buckets with Environment", () => {
expect(bucketTags).toHaveProperty("Environment");
});
it("should tag buckets with ManagedBy", () => {
expect(bucketTags.ManagedBy).toBe("pulumi");
});
});Тестування Terraform використовує terraform test (введений у Terraform 1.6) або зовнішні інструменти, такі як Terratest. terraform test запускає тестові файли HCL, які створюють реальні ресурси в ізольованих конфігураціях. Terratest - це бібліотека Go, яка обгортає команди Terraform та надає асерції.
# tests/bucket.tftest.hcl - Terraform native test
run "bucket_tags" {
command = plan
assert {
condition = aws_s3_bucket.data["dev"].tags["Environment"] == "dev"
error_message = "Bucket must be tagged with Environment"
}
assert {
condition = aws_s3_bucket.data["dev"].tags["ManagedBy"] == "terraform"
error_message = "Bucket must be tagged with ManagedBy"
}
}Обидва підходи валідують конфігурацію інфраструктури. Перевага Pulumi - інтеграція з test runners TypeScript та інструментами покриття коду. Нативні тести Terraform працюють без зовнішніх залежностей, але вимагають синтаксису HCL.
Питання для Співбесіди: Pulumi vs Terraform
Співбесіди DevOps у 2026 році часто включають порівняння інструментів IaC. Ось питання, які виділяють кандидатів, які використовували обидва інструменти у продакшені.
"Що відбувається, коли стан Terraform розходиться з реальною інфраструктурою?"
Очікувана відповідь: terraform plan виявляє дрифт, порівнюючи стан з реальною інфраструктурою. План показує ресурси для оновлення, створення або знищення. Дрифт виникає, коли зміни вносяться поза Terraform (консоль, CLI, інші інструменти). Варіанти включають terraform refresh для оновлення стану, terraform import для взяття ресурсів під керування, або прийняття плану для відновлення бажаного стану.
"Як Pulumi обробляє секрети інакше, ніж Terraform?"
Очікувана відповідь: Pulumi за замовчуванням шифрує секрети в стані, використовуючи пароль або хмарний KMS. Функція pulumi.secret() позначає значення як чутливі, і вони залишаються зашифрованими у спокої. Terraform зберігає секрети у відкритому вигляді у файлах стану; команди покладаються на шифрування бекенду (серверне шифрування S3) та контроль доступу. Terraform 1.4 додав позначення змінних як sensitive, але значення все одно з'являються незашифрованими в стані.
"Чому HashiCorp визнав CDKTF застарілим і які варіанти міграції?"
Очікувана відповідь: CDKTF додавав накладні витрати на обслуговування без відповідності темпу оновлень Terraform. Нові версії провайдерів та функції Terraform вимагали ручних оновлень прив'язок CDK. HashiCorp вирішив зосередитися на HCL та Terraform Cloud. Варіанти міграції: конвертація в HCL за допомогою cdktf convert, переписування на Pulumi, якщо потрібен TypeScript, або продовження запуску існуючих стеків CDKTF без оновлень.
"Коли б ви обрали Pulumi замість Terraform для нового проекту?"
Очікувана відповідь: Обирайте Pulumi, коли команда вже використовує TypeScript/Python/Go і хоче IaC тією ж мовою, що й код застосунку, коли складні абстракції вимагають справжніх програмних конструкцій (дженерики, інтерфейси, тестові фреймворки), або коли вбудоване шифрування секретів є вимогою. Обирайте Terraform, коли команда знає HCL, коли екосистема провайдерів повинна включати нішевих або спільнотних провайдерів, або коли організаційні інструменти (Atlantis, Spacelift) інтегруються з Terraform.
Стратегії Міграції: Terraform до Pulumi
Pulumi надає pulumi import для взяття існуючих хмарних ресурсів під керування без їх відтворення. Для команд зі станом Terraform, pulumi convert перекладає HCL на програми Pulumi. Конвертація не є ідеальною: складні модулі та динамічні блоки вимагають ручного коригування.
# Convert Terraform HCL to Pulumi TypeScript
pulumi convert --from terraform --language typescript
# Import existing AWS resources into Pulumi state
pulumi import aws:s3/bucketV2:BucketV2 my-bucket my-existing-bucket-nameПоетапна міграція дозволяє командам запускати обидва інструменти під час переходу. Terraform керує існуючими стеками, тоді як Pulumi створює нову інфраструктуру. Коли команди набувають досвіду з Pulumi, вони поступово конвертують стеки Terraform. Стан не поділяється між інструментами, тому керування ресурсами повинно бути чітко розділене, щоб уникнути конфліктів.
Фреймворк Прийняття Рішень на 2026 Рік
| Фактор | Terraform | Pulumi |
|---|---|---|
| Мова | HCL (DSL) | TypeScript, Python, Go, C#, Java, YAML |
| Керування станом | Самостійне або Terraform Cloud | Pulumi Cloud (за замовчуванням) або самостійне |
| Обробка секретів | Відкритий текст у стані, шифрування бекенду | Зашифровано за замовчуванням |
| Тестування | terraform test, Terratest | Нативні тестові фреймворки мови |
| Охоплення провайдерів | 4000+ у реєстрі | Міст для провайдерів Terraform + нативні SDK |
| Підтримка TypeScript | CDKTF (застарілий грудень 2025) | Першокласна, активно підтримувана |
| Крива навчання | HCL спеціально спроектований, швидкий для IaC | Вимагає існуючого знання мови |
| Корпоративні функції | Terraform Cloud/Enterprise | Pulumi Cloud/self-hosted |
Коли запитують про Pulumi vs Terraform, уникайте твердження, що одне "краще". Формулюйте компроміси: Terraform має більшу екосистему, а обмеження HCL запобігають помилкам виконання; Pulumi пропонує справжні мовні функції та типізовані SDK. Покажіть, що вибір залежить від навичок команди, існуючих інструментів та вимог проекту.
Ключові Висновки для Infrastructure as Code у 2026
- Terraform 1.16 є стабільним вибором для IaC на основі HCL з найбільшою екосистемою провайдерів та зрілими інструментами (Atlantis, Spacelift, env0).
- Pulumi v3.263 пропонує TypeScript, Python, Go та C# з нативним тестуванням мовою, інтеграцією IDE та вбудованим шифруванням секретів.
- CDKTF застарілий з грудня 2025. Команди, які хочуть TypeScript IaC, повинні оцінити Pulumi замість запуску нових проектів CDKTF.
- Обидва інструменти підтримують multi-cloud розгортання, віддалені бекенди стану та командну співпрацю. Вибір залежить від мовних уподобань та існуючої експертизи команди.
- Обговорення на співбесідах повинні демонструвати розуміння керування станом, виявлення дрифту, екосистем провайдерів та компромісів між простотою DSL та потужністю мови загального призначення.
- Міграція з Terraform на Pulumi можлива за допомогою
pulumi convertтаpulumi import, але вимагає ретельного планування та поетапного впровадження.
Починай практикувати!
Перевір свої знання з нашими симуляторами співбесід та технічними тестами.
Чи знайдеш ти помилку в DevOps?
Справжній фрагмент коду, прихована помилка, одна спроба на день. Щоб спробувати, акаунт не потрібен.

Автор:
Anthony Fillion-MailletЗасновник SharpSkill
Fullstack-розробник понад 10 років. Керує SharpSkill і відповідає за все, що тут публікується.
Оновлено 21 вересня 2026 р.
Поділитися
Пов'язані статті

Безпека DevOps Pipeline у 2026: SAST, DAST, Supply Chain та Питання на Співбесіді
Повний посібник із захисту CI/CD pipeline у 2026 році. Охоплює SAST, DAST, SCA, SBOM, SLSA provenance та практичні питання для співбесід DevSecOps.

Безпека DevOps Pipeline у 2026: Найкращі Практики DevSecOps та Питання на Співбесідах
Комплексний посібник з безпеки CI/CD pipeline, практик DevSecOps та найпоширеніших питань на технічних співбесідах у 2026 році.

Керування Секретами Kubernetes у 2026: External Secrets, Vault та Питання для Співбесід
Повний посібник з керування секретами Kubernetes за допомогою External Secrets Operator та HashiCorp Vault. Безпечні патерни, найкращі практики та питання для співбесід DevOps.