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 vs Terraform 2026: TypeScript ile Infrastructure as Code ve 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.

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.

infra/index.ts - Pulumi TypeScript exampletypescript
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<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.

infra/vpc.ts - Pulumi component for reusable VPC abstractiontypescript
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.

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.

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.

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.

__tests__/infra.test.ts - Unit testing Pulumi resources with Vitesttypescript
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.

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

FaktorTerraformPulumi
DilHCL (DSL)TypeScript, Python, Go, C#, Java, YAML
Durum yonetimiKendi kendine yonetilen veya Terraform CloudPulumi Cloud (varsayilan) veya kendi kendine yonetilen
Sir islemeDurumda duz metin, arka uc sifrelemeVarsayilan olarak sifreli
Testterraform test, TerratestYerel dil test cerceveleri
Provider kapsamasiKayit defterinde 4.000+Terraform providerlari icin kopru + yerel SDK'lar
TypeScript destegiCDKTF (Aralik 2025'te kullanim disi)Birincil sinif, aktif olarak surdurulen
Ogrenme egrisiHCL amaca yonelik tasarlanmis, IaC icin hizliMevcut dil bilgisi gerektirir
Kurumsal ozelliklerTerraform Cloud/EnterprisePulumi 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.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Günün meydan okuması

DevOps kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill 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