# 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. - Published: 2026-09-21 - Updated: 2026-09-21 - Author: Anthony Fillion-Maillet - Reading time: 14 min --- 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. > **Surum Baglami: Eylul 2026** > > 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`. ```typescript // infra/index.ts - Pulumi TypeScript example 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: ```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] } ``` 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` 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. ```typescript // infra/vpc.ts - Pulumi component for reusable VPC abstraction 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; public readonly publicSubnetIds: pulumi.Output[]; 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. ```bash # 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. ## 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. ```typescript // 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. ```typescript // __tests__/infra.test.ts - Unit testing Pulumi resources with Vitest 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; 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)); }); }); 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. ```hcl # 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. ```bash # 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 ``` Asamali 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 | > **Mulakat Ipucu** > > 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 convert` ve `pulumi import` kullanilarak mumkundur, ancak dikkatli planlama ve asamali kullanima alma gerektirir. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/tr/blog/devops/pulumi-vs-terraform-2026-infrastructure-as-code-typescript-interview-questions