Pulumi vs Terraform 2026: TypeScript ile Infrastructure as Code ve Mulakat Sorulari
2026 yilinda Pulumi ve Terraform karsilastirmasi. TypeScript ile kod olarak altyapi, durum yonetimi ve DevOps mulakat sorulari.

Pulumi ve Terraform, 2026 yilinda DevOps ekipleri icin kod olarak altyapi konusundaki merkezi karari temsil etmektedir. Her iki arac da bulut kaynaklarini deklaratif olarak olusturmakta, ancak dil destegi, durum yonetimi ve ekosistem olgunlugu acisindan farklilik gostermektedir. Bu karsilastirma, teknik odunleri, TypeScript ve HCL'deki kod orneklerini ve IaC secimleri tartisirken ortaya cikan mulakat sorularini kapsamaktadir.
Bu karsilastirma Pulumi v3.263.0 (15 Eylul 2026 tarihinde yayinlandi) ve Terraform 1.16.3 (26 Agustos 2026 tarihinde yayinlandi) kullanmaktadir. HashiCorp'un Terraform icin TypeScript katmani olan CDKTF, Aralik 2025'te kullanim disi birakilmis ve arsivlenmistir.
Temel Mimari: Pulumi Motoru vs Terraform'un Plan-Apply Dongusu
Terraform, alana ozgu bir dil (HCL) ve iki asamali bir is akisi kullanmaktadir: terraform plan bir yurutme plani olusturur, terraform apply bunu yurutur. Durum dosyasi kaynak meta verilerini izler ve yerel olarak veya S3 ya da Terraform Cloud gibi uzak arka uclarda saklanir.
Pulumi, motorunu genel amacli calisma zamanlarinda gomulu hale getirir. TypeScript, Python, Go veya C# ile yazilan programlar, Pulumi providerlari araciligiyla dogrudan bulut API'lerine karsi yurutulur. Durum varsayilan olarak Pulumi Cloud'da saklanir ve S3, Azure Blob Storage ve yerel dosyalar dahil kendi kendine yonetilen arka uc secenekleri de mevcuttur.
Mimari fark, her aracin donguleri, kosullari ve soyutlamalari nasil ele aldiginda hemen ortaya cikmaktadir. Terraform'un for_each ve count ogeleri HCL'nin kisitlamalari dahilinde calisir. Pulumi programlari yerel dil yapilarini kullanir: TypeScript'te for...of, Python'da list comprehension, Go'da range.
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);Esdeger Terraform yapilandirmasi, iterasyon icin HCL sozdizimi gerektirir:
# 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]
}Her iki kod parcasi da uc S3 bucket olusturur. Terraform surumu, HCL'ye asina olan herkes icin kisa ve okunabilirdir. Pulumi surumu standart TypeScript kullanir, bu da IDE otomatik tamamlama, tip kontrolu ve yeni bir dil ogrenmeden mevcut kod tabanlariyla entegrasyon anlamina gelir.
TypeScript Destegi: Yerel Dil vs CDKTF (Kullanim Disi)
Pulumi, ilk halka acik surumunden bu yana TypeScript'i desteklemektedir. SDK, tipli kaynak siniflari sunar ve pulumi.Output<T> dagitim sirasinda cozumlenen asenkron degerleri sarar. TypeScript ekosisteminden yeniden duzenleme araclari, linterlar ve test cerceveleri dogrudan uygulanir.
Terraform'un genel amacli dil destegine yaniti CDKTF (Terraform icin Cloud Development Kit) idi. CDKTF, ekiplerin Terraform JSON'a derlenen TypeScript veya Python yazmasina izin veriyordu. HashiCorp, Aralik 2025'te CDKTF'yi kullanim disi birakti ve depoyu arsivledi. Mevcut CDKTF projeleri hala calisir, ancak yeni Terraform surumleri veya provider degisiklikleri icin guncelleme yayinlanmamaktadir.
2026'da TypeScript IaC isteyen ekipler icin Pulumi, aktif olarak surdurulen secenektir. CDKTF'ye yatirim yapmis ekipler yigitlarini calistirmaya devam edebilir, ancak yeni gelistirme icin HCL veya Pulumi'ye gecis ileriye donuk yoldur.
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 });
}
}Bu Pulumi bileseni, yeniden kullanilabilir bir VPC soyutlamasi olusturur. Tuketiciler bunu new StandardVpc("prod", { cidr: "10.0.0.0/16", azCount: 3 }) ile orneklendirir. Terraform'daki esdegeri, degiskenler, ciktilar ve HCL dosyalari iceren bir modul dizinidir. Her iki yaklasim da yeniden kullanimi saglar; Pulumi surumu, dokumantasyon, test ve surum yonetimi icin TypeScript araclarini miras alir.
Durum Yonetimi ve Arka Uc Secenekleri
Durum yonetimi, operasyonel farkliliklarin ortaya ciktigi yerdir. Terraform durumu kaynak kimliklerini, provider meta verilerini ve hassas degerleri icerir. Ekipler, is birligini saglamak icin uzak arka uclari yapilandirmali ve es zamanli degisiklikleri onlemek icin kilitleme uygulamalidir.
Terraform arka uc yapilandirmasi S3, Azure Blob, Google Cloud Storage, Terraform Cloud ve diger secenekleri destekler. Her arka uc kendi kimlik dogrulama kurulumunu gerektirir. Durum kilitleme, S3 arka uclari icin DynamoDB, Azure icin blob kiralamalari veya Terraform Cloud'da yerel kilitleme kullanir.
Pulumi Cloud, varsayilan olarak durum depolama, kilitleme ve gecmisi yonetir. Ekipler ucretsiz bir hesap olusturur, pulumi login calistirir ve durum yonetimi yapilandirilmis olur. Kendi kendine yonetilen durum gerektiren ekipler icin Pulumi, pulumi login komutuyla S3, Azure Blob, GCS ve yerel dosya arka uclerini destekler.
# 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, yigin gecmisi, kaynak gorsellestirme ve ekip izinleri icin bir web arayuzu saglar. Terraform Cloud, Sentinel araciligiyla politika uygulamasiyla benzer ozellikler sunar. Her ikisi icin de kendi kendine barindirilan secenekler mevcuttur: Pulumi'nin kendi kendine barindirilan arka ucu ve Terraform Enterprise.
DevOps mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
Provider Ekosistemi ve Coklu Bulut Destegi
Terraform'un provider ekosistemi IaC'deki en buyugudur. Terraform Registry, AWS, Azure, GCP, Kubernetes ve yuzlerce SaaS platformunu kapsayan 4.000'den fazla provider listelemektedir. Provider kalitesi degiskendir: resmi HashiCorp ve bulut saglayici providerlari duzenloli guncellemeler alirken, topluluk providerlari API degisikliklerinin gerisinde kalabilir.
Pulumi providerlari, tipli SDK'lar ureten bir kopru kullanarak Terraform providerlarini sarar. Pulumi Registry, buyuk bulutlar, Kubernetes, veritabanlari ve izleme hizmetleri icin providerlar sunar. Pulumi, Terraform providerlarini kopruledigi icin ekosistem kapsamasi karsilastirmalidir, ancak yeni Terraform provider surumlerinin Pulumi SDK'larina yansimasi icin kopru guncellemeleri gerekir.
Pulumi ayrica dogrudan bulut API'lerine karsi yazilan yerel providerlar da sunar. AWS, Azure ve Kubernetes icin yerel providerlar, yeni API ozellikleri icin ayni gun destegi saglar. Dezavantaj, yerel providerlarin yalnizca buyuk bulutlar icin mevcut olmasi; daha az yaygin hizmetler koprulenmis providerlar kullanir.
// 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;Altyapi Kodunu Test Etme
Test etme, dil seciminin farklilik yarattigi yerdir. Pulumi programlari standart koddur, bu nedenle birim testleri bilinen cerceveleri kullanir. @pulumi/pulumi/runtime modulu, kaynak olusturma icin mocklama saglar ve testlerin kaynaklari dagitmadan yapilandirmayi dogrulamasina izin verir.
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 testi terraform test (Terraform 1.6'da tanitildi) veya Terratest gibi harici araclar kullanir. terraform test, izole yapilandirmalarda gercek kaynaklar olusturan HCL test dosyalarini calistirir. Terratest, Terraform komutlarini saran ve assertion'lar saglayan bir Go kutuphanesidir.
# 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"
}
}Her iki yaklasim da altyapi yapilandirmasini dogrular. Pulumi'nin avantaji, TypeScript test runner'lari ve kapsama araclariyla entegrasyondur. Terraform'un yerel testleri harici bagimliliklar olmadan calisir ancak HCL sozdizimi gerektirir.
Mulakat Sorulari: Pulumi vs Terraform
2026'daki DevOps mulakatlari siklikla IaC arac karsilastirmalarini icerir. Iste her iki araci da uretimde kullanan adaylari ayirt eden sorular.
"Terraform durumu gercek altyapiyla uyumsuz hale geldiginde ne olur?"
Beklenen yanit: terraform plan, durumu gercek altyapiyla karsilastirarak kaymayi tespit eder. Plan, guncellenecek, olusturulacak veya yok edilecek kaynaklari gosterir. Kayma, Terraform disinda degisiklikler yapildiginda olusur (konsol, CLI, diger araclar). Secenekler arasinda durumu guncellemek icin terraform refresh, kaynaklari yonetime almak icin terraform import veya istenen durumu geri yuklemek icin plani kabul etme yer alir.
"Pulumi, sirlari Terraform'dan nasil farkli yonetiyor?"
Beklenen yanit: Pulumi, durumda sirlari varsayilan olarak bir parola veya bulut KMS kullanarak sifreler. pulumi.secret() fonksiyonu degerleri hassas olarak isaretler ve bunlar duragan halde sifreli kalir. Terraform, sirlari durum dosyalarinda duz metin olarak saklar; ekipler arka uc sifrelemeye (S3 sunucu tarafi sifreleme) ve erisim kontrollerine guvenirler. Terraform 1.4, sensitive degisken isaretlemesini ekledi, ancak degerler yine de durumda sifrelenmemis olarak gorunur.
"HashiCorp neden CDKTF'yi kullanim disi birakti ve gecis secenekleri nelerdir?"
Beklenen yanit: CDKTF, Terraform'un guncelleme tempoyyla eslesemeden bakim yuku ekledi. Yeni provider surumleri ve Terraform ozellikleri, CDK baglamalarinda manuel guncellemeler gerektirdi. HashiCorp, HCL ve Terraform Cloud'a odaklanmayi secti. Gecis secenekleri sunlardir: cdktf convert kullanarak HCL'ye donusturme, TypeScript gerekiyorsa Pulumi'de yeniden yazma veya mevcut CDKTF yigitlarini guncellemeler olmadan calistirmaya devam etme.
"Yeni bir proje icin Terraform yerine Pulumi'yi ne zaman secersiniz?"
Beklenen yanit: Ekip zaten TypeScript/Python/Go kullaniyorsa ve IaC'yi uygulama koduyla ayni dilde istiyorsa, karmasik soyutlamalar gercek programlama yapilari gerektiriyorsa (jenerikler, arayuzler, test cerceveleri) veya yerlesik sir sifreleme bir gereklilikse Pulumi'yi secin. Ekip HCL'yi biliyorsa, provider ekosistemi nisalan veya topluluk providerlarini icermek zorundaysa veya kurumsal araclar (Atlantis, Spacelift) Terraform ile entegre oluyorsa Terraform'u secin.
Gecis Stratejileri: Terraform'dan Pulumi'ye
Pulumi, mevcut bulut kaynaklarini yeniden olusturmadan yonetime almak icin pulumi import saglar. Terraform durumuna sahip ekipler icin pulumi convert, HCL'yi Pulumi programlarina cevirir. Donusum mukemmel degildir: karmasik moduller ve dinamik bloklar manuel ayarlama gerektirir.
# 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-nameAsamali bir gecis, ekiplerin gecis sirasinda her iki araci da calistirmasina izin verir. Terraform mevcut yiginlari yonetirken Pulumi yeni altyapiyi saglar. Ekipler Pulumi deneyimi kazandikca, Terraform yiginlarini kademeli olarak donusturur. Durum araclar arasinda paylasilmaz, bu nedenle catismalari onlemek icin kaynak yonetimi acikca bolunmelidir.
2026 icin Karar Cercevesi
| Faktor | Terraform | Pulumi |
|---|---|---|
| Dil | HCL (DSL) | TypeScript, Python, Go, C#, Java, YAML |
| Durum yonetimi | Kendi kendine yonetilen veya Terraform Cloud | Pulumi Cloud (varsayilan) veya kendi kendine yonetilen |
| Sir isleme | Durumda duz metin, arka uc sifreleme | Varsayilan olarak sifreli |
| Test | terraform test, Terratest | Yerel dil test cerceveleri |
| Provider kapsamasi | Kayit defterinde 4.000+ | Terraform providerlari icin kopru + yerel SDK'lar |
| TypeScript destegi | CDKTF (Aralik 2025'te kullanim disi) | Birincil sinif, aktif olarak surdurulen |
| Ogrenme egrisi | HCL amaca yonelik tasarlanmis, IaC icin hizli | Mevcut dil bilgisi gerektirir |
| Kurumsal ozellikler | Terraform Cloud/Enterprise | Pulumi Cloud/kendi kendine barindirilan |
Pulumi vs Terraform hakkinda soruldugunda, birinin "daha iyi" oldugunu belirtmekten kacinin. Odunleri ifade edin: Terraform daha buyuk bir ekosisteme sahiptir ve HCL'nin kisitlamalari calisma zamani hatalarini onler; Pulumi gercek dil ozellikleri ve tipli SDK'lar sunar. Secimin ekip becerilerine, mevcut araclara ve proje gereksinimlerine bagili oldugunu gosterin.
2026'da Infrastructure as Code icin Temel Cikarimlar
- Terraform 1.16, en buyuk provider ekosistemi ve olgun araclarla (Atlantis, Spacelift, env0) HCL tabanli IaC icin istikrarli secimdir.
- Pulumi v3.263, yerel dil testi, IDE entegrasyonu ve yerlesik sir sifreleme ile TypeScript, Python, Go ve C# sunar.
- CDKTF, Aralik 2025'ten bu yana kullanim disi birakilmistir. TypeScript IaC isteyen ekipler, yeni CDKTF projeleri baslatmak yerine Pulumi'yi degerlendirmelidir.
- Her iki arac da coklu bulut dagitimlarini, uzak durum arka uclerini ve ekip is birligini destekler. Secim, dil tercihine ve mevcut ekip uzmanlugina baaglidir.
- Mulakat tartismalari, durum yonetimi, kayma tespiti, provider ekosistemleri ve DSL basitligi ile genel amacli dil gucu arasindaki odunlerin anlasildigini gostermelidir.
- Terraform'dan Pulumi'ye gecis,
pulumi convertvepulumi importkullanilarak mumkundur, ancak dikkatli planlama ve asamali kullanima alma gerektirir.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
DevOps kodundaki hatayı bulabilir misin?
Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Yazan:
Anthony Fillion-MailletSharpSkill kurucusu
10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.
21 Eylül 2026 tarihinde güncellendi
Paylaş
İlgili makaleler

2026'da DevOps Pipeline Güvenliği: SAST, DAST, Supply Chain ve Mülakat Soruları
2026 yılında CI/CD pipeline güvenliğini sağlama konusunda kapsamlı rehber. SAST, DAST, SCA, SBOM, SLSA provenance ve pratik DevSecOps mülakat sorularını içerir.

2026 DevOps Pipeline Güvenliği: DevSecOps En İyi Uygulamaları ve Mülakat Soruları
CI/CD pipeline güvenliği, DevSecOps pratikleri ve 2026 yılında en sık sorulan mülakat sorularına kapsamlı rehber.

2026'da Kubernetes Secrets Yönetimi: External Secrets, Vault ve Mülakat Soruları
External Secrets Operator ve HashiCorp Vault ile Kubernetes secrets yönetiminde uzmanlaşma rehberi. Güvenli kalıplar, en iyi uygulamalar ve DevOps mülakat soruları.