Ulaşım
- Adres: 2342 Sk, İpekyol, İpek Ap 49A, 63250 Haliliye/Şanlıurfa
- Telefon:
0505 532 36 38 - eMail: info@alestaweb.com
Pulumi vs Terraform sorusu 2026 yılında DevOps ve cloud mühendislerinin gündemini meşgul etmeye devam ediyor. Infrastructure as Code (IaC) alanında her iki araç da güçlü yetenekler sunuyor ancak yaklaşımları temelden farklı. Alesta Web cloud altyapı ekibi olarak hem Pulumi hem de Terraform'u production'da kullanan bir perspektifle bu kapsamlı Pulumi vs Terraform karşılaştırmasını hazırladık. Hangisini seçmeli? Cevap bu makalede!
Pulumi vs Terraform karşılaştırmasının özünde dil felsefesi yatar. Infrastructure as Code karşılaştırması açısından Terraform, HashiCorp Configuration Language (HCL) adı verilen özel bir domain-specific language (DSL) kullanırken Pulumi gerçek programlama dillerini destekler: Python, TypeScript, Go, C# ve Java.
Bu temel fark, her iki aracın tüm ekosistemini şekillendirir. Alesta Web cloud projelerinde bu iki yaklaşımın pratikte nasıl farklılaştığını detaylı inceledik.
2026 itibarıyla HashiCorp'un BSL lisans değişikliğinin ardından OpenTofu, Terraform'un açık kaynaklı fork'u olarak büyük ivme kazandı. Pulumi vs Terraform karşılaştırması artık OpenTofu da dahil üç taraflı bir rekabete dönüştü. Alesta Web her üç aracı da takip etmektedir.
Pulumi vs Terraform tartışmasının merkezinde HCL (HashiCorp Configuration Language) ile gerçek programlama dilleri arasındaki fark yatmaktadır. Infrastructure as Code karşılaştırmasında bu fark günlük kullanımda ciddi pratik etkilere yol açar.
# Terraform HCL ile birden fazla S3 bucket oluşturma
variable "buckets" {
default = ["logs", "backups", "assets"]
}
resource "aws_s3_bucket" "buckets" {
for_each = toset(var.buckets)
bucket = "alestaweb-${each.key}-prod"
tags = {
Name = each.key
Environment = "production"
ManagedBy = "terraform"
}
}
# HCL'de koşullu mantık - sınırlı
resource "aws_s3_bucket_versioning" "versioning" {
for_each = aws_s3_bucket.buckets
bucket = each.value.id
versioning_configuration {
status = each.key == "backups" ? "Enabled" : "Disabled"
}
}
import pulumi
import pulumi_aws as aws
# Tam Python gücü ile Infrastructure as Code
bucket_configs = [
{"name": "logs", "versioning": False, "lifecycle_days": 30},
{"name": "backups", "versioning": True, "lifecycle_days": 90},
{"name": "assets", "versioning": False, "lifecycle_days": None},
]
buckets = {}
for config in bucket_configs:
bucket_name = f"alestaweb-{config['name']}-prod"
bucket = aws.s3.Bucket(
bucket_name,
bucket=bucket_name,
tags={"Name": config["name"], "Environment": "production", "ManagedBy": "pulumi"}
)
# Koşullu versioning - gerçek Python if
if config["versioning"]:
aws.s3.BucketVersioningV2(
f"{bucket_name}-versioning",
bucket=bucket.id,
versioning_configuration={"status": "Enabled"}
)
# Koşullu lifecycle - döngü içinde karmaşık mantık
if config["lifecycle_days"]:
aws.s3.BucketLifecycleConfigurationV2(
f"{bucket_name}-lifecycle",
bucket=bucket.id,
rules=[{"id": "auto-delete", "status": "Enabled",
"expiration": {"days": config["lifecycle_days"]}}]
)
buckets[config["name"]] = bucket
# Output
pulumi.export("bucket_arns", {k: v.arn for k, v in buckets.items()})
Pulumi kodu gerçek Python/TypeScript olduğundan kod kalitesi standartları (linting, type check, test) uygulanmalıdır. Infrastructure as Code karşılaştırmasında bu bir avantaj olduğu kadar ek sorumluluk da getirir.
Pulumi vs Terraform rekabetinde state yönetimi kritik bir faktördür. Her iki araç da altyapı durumunu takip etmek için state dosyaları kullanır ancak yaklaşımları farklıdır.
# Terraform remote state - S3 backend
terraform {
backend "s3" {
bucket = "alestaweb-terraform-state"
key = "prod/terraform.tfstate"
region = "eu-central-1"
encrypt = true
dynamodb_table = "terraform-state-lock"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# State komutları
# terraform state list
# terraform state show aws_s3_bucket.main
# terraform state mv aws_s3_bucket.old aws_s3_bucket.new
# terraform import aws_s3_bucket.existing existing-bucket-name
# Pulumi state - Pulumi Cloud (varsayılan, ücretsiz tier mevcut)
pulumi login
# Self-hosted: S3 backend
pulumi login s3://alestaweb-pulumi-state
# Local state (geliştirme için)
pulumi login --local
# State komutları
pulumi stack ls
pulumi stack select prod
pulumi stack export > stack-backup.json
pulumi stack import < stack-backup.json
# Refresh (gerçek altyapıyla senkronize et)
pulumi refresh
# Mevcut kaynağı import et
pulumi import aws:s3/bucket:Bucket my-bucket existing-bucket-name
Pulumi Cloud ücretsiz tier bireysel geliştiriciler için yeterlidir. Alesta Web gibi ekipler için Terraform Cloud ve Pulumi Cloud'un ücretli planları benzer feature setleri sunar. Infrastructure as Code karşılaştırmasında maliyet bu açıdan dengeli.
Pulumi vs Terraform karşılaştırmasında provider ekosistemi önemli bir faktördür. Infrastructure as Code karşılaştırması açısından Terraform, binlerce provider ile daha geniş bir ekosisteme sahipken Pulumi hızla yetişmektedir.
# Terraform Registry
# 4000+ provider
# Önemli olanlar: AWS, Azure, GCP, Kubernetes, Datadog, PagerDuty, GitHub
# Pulumi Registry
# 150+ native provider + Terraform bridged (3500+)
# pulumi-terraform-bridge ile tüm Terraform provider'ları kullanılabilir!
# Pulumi'de Terraform provider kullanma örneği
# pulumi new typescript
# npm install @pulumi/terraform-provider-alestaweb
# Terraform provider bridge
cat > Pulumi.yaml