
Pulumi Automation API ile PR Bazlı İzole Test Altyapıları: State Yönetimi ve Maliyet Optimizasyonu

Giriş
Paylaşımlı staging ortamları, mikroservis mimarilerinde takım boyutu 15 kişiyi aştığı andan itibaren darboğaz yaratmaya başlar. Özellikle veritabanı şema değişiklikleri ve asenkron message broker (RabbitMQ/Kafka) state’leri, aynı ortamı kullanan farklı geliştiricilerin testlerini bozma eğilimindedir. 2021 yılındaki bir e-ticaret ödeme geçidi projesinde, paylaşımlı staging ortamında aynı anda çalışan iki Pull Request’in (PR) Redis cache invalidation adımında yarattığı yarış durumu (race condition) sonucu, entegrasyon test süreleri 18 dakikadan 45 dakikaya çıkmış ve CI/CD pipeline’ında %22 oranında false-negative test raporlanmıştı. Bu tür state çakışmalarını çözmenin mutlak yolu, altyapıyı statik bir hedef olmaktan çıkarıp, her PR için izole ve geçici (ephemeral) altyapılar provizyonlamaktır.
Pulumi Automation API, altyapıyı kod olarak yönetme (IaC) paradigmasını geleneksel CLI (Command Line Interface) bağımlılığından kurtarır. Altyapı yaşam döngüsünü doğrudan bir Node.js, Python veya Go uygulamasının içerisine gömer. CI/CD pipeline’larında bash script’leri üzerinden parametre parse etmek yerine, hata yönetimi (error handling), state backend senkronizasyonu ve stack temizleme (teardown) işlemlerini tam teşekküllü bir programlama dilinin hata yakalama blokları (try/catch) içerisinde yönetme imkanı sunar.
İçindekiler
- Automation API Mimarisi ve Programatik Yaşam Döngüsü
- GitHub Actions ve OIDC Tabanlı AWS Entegrasyonu
- Performans ve Trade-off Analizi
- Production Vaka İncelemesi: Zombi Stack’ler ve Fatura Şokları
- Production Önerileri
- Sık Sorulan Sorular
- Sonuç
Automation API Mimarisi ve Programatik Yaşam Döngüsü
Pulumi Automation API, CLI komutlarını bir alt süreç (subprocess) olarak çalıştırmak yerine, Pulumi motoru ile gRPC üzerinden iletişim kuran bir SDK sunar. Bu yapı, CI/CD pipeline’ları içerisinde dinamik stack isimleri oluşturmayı ve ortam değişkenlerini izole etmeyi kolaylaştırır. PR bazlı altyapılarda temel strateji, her PR numarasına karşılık gelen bir stack yaratmak ve PR kapatıldığında bu stack’i yok etmektir.
Aşağıdaki TypeScript örneği, bir PR açıldığında AWS üzerinde izole bir VPC ve PostgreSQL container’ı provizyonlayan otomasyon mantığını göstermektedir:
import { LocalWorkspace } from "@pulumi/pulumi/automation";
import * as upath from "upath";
async function provisionPrEnvironment(prNumber: number, commitSha: string) {
const stackName = `pr-${prNumber}`;
const workDir = upath.join(__dirname, "..", "infrastructure");
// Workspace ve Stack başlatma
const stack = await LocalWorkspace.createOrSelectStack({
stackName: stackName,
workDir: workDir,
});
console.log(`[+] Stack ${stackName} başlatılıyor...`);
// Dinamik konfigürasyon atamaları
await stack.setConfig("aws:region", { value: "eu-central-1" });
await stack.setConfig("app:commitSha", { value: commitSha });
await stack.setConfig("db:instanceType", { value: "db.t4g.micro" }); // PR ortamı için düşük maliyetli ARM işlemci
// Pulumi Up işleminin çalıştırılması
const upRes = await stack.up({ onOutput: console.info });
console.log(`[+] Altyapı provizyonlandı. Toplam kaynak: ${Object.keys(upRes.outputs).length}`);
return upRes.outputs;
}
// Kullanım: provisionPrEnvironment(1045, "a1b2c3d").catch(console.error);
Bu yaklaşımda createOrSelectStack metodu kritik bir rol oynar. PR’a yeni bir commit eklendiğinde aynı pipeline tekrar tetiklenecektir. Metot, stack daha önce oluşturulmuşsa mevcut state dosyasını (S3 veya Pulumi Cloud üzerindeki) kilitler ve sadece commitSha değişikliğine bağlı delta güncellemelerini uygular. Bu sayede her commit’te veritabanını baştan kurma maliyeti ortadan kalkar.
GitHub Actions ve OIDC Tabanlı AWS Entegrasyonu
Otomasyon script’imizi GitHub Actions üzerinde koştururken karşılaşılan en büyük güvenlik riski, uzun ömürlü AWS erişim anahtarlarının (Access Key ID / Secret Access Key) GitHub Secrets içinde tutulmasıdır. 2022’de yayınlanan AWS OIDC (OpenID Connect) entegrasyonu, bu anahtarlara olan ihtiyacı tamamen ortadan kaldırır. Kısa ömürlü (maksimum 1 saatlik) STS token’ları kullanarak Pulumi’nin AWS kaynaklarını yönetmesine izin vermeliyiz.
Aşağıdaki YAML konfigürasyonu, PR açıldığında veya güncellendiğinde OIDC ile yetkilendirme yaparak Pulumi Automation API script’ini tetikler:
name: PR Infrastructure Provisioning
on:
pull_request:
types: [opened, synchronize, reopened, closed]
permissions:
id-token: write
contents: read
jobs:
manage-infrastructure:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsPulumiRole
aws-region: eu-central-1
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Dependencies
run: npm ci
- name: Provision Infrastructure (On PR Open/Sync)
if: github.event.action != 'closed'
run: npx ts-node scripts/provision.ts ${{ github.event.pull_request.number }} ${{ github.sha }}
- name: Destroy Infrastructure (On PR Close)
if: github.event.action == 'closed'
run: npx ts-node scripts/teardown.ts ${{ github.event.pull_request.number }}
Yukarıdaki akışta teardown.ts script’i, stack.destroy() ve ardından stack.workspace.removeStack() çağrılarını yaparak geçici kaynakları temizler. Bu adım, bulut maliyetlerinin kontrol altında tutulması için yaşamsal öneme sahiptir.
Performans ve Trade-off Analizi
Geçici ortamlar oluştururken kullanılabilecek tek araç Pulumi değildir. Terraform Workspaces, Kubernetes Namespace izolasyonu (vcluster) ve AWS CloudFormation gibi alternatifler de mevcuttur. Hangi yöntemin seçileceği, altyapı karmaşıklığı ve izolasyon seviyesi gereksinimlerine göre değişir.
| Kriter | Pulumi Automation API | Terraform (CDKTF) + Workspaces | Kubernetes vcluster |
|---|---|---|---|
| Durum Yönetimi (State Lock) Çözümleme | Ortalama 0.8 saniye | Ortalama 4.2 saniye | Uygulanamaz (etcd içi yönetim) |
| Dinamik Değişken Enjeksiyonu | Doğrudan dil içi değişkenler (Native) | TF_VAR environment variable üzerinden | Helm values.yaml modifikasyonu |
| Tam İzolasyon (DB + Network dahil) | Evet (AWS VPC seviyesi izole) | Evet (AWS VPC seviyesi izole) | Hayır (Sadece Cluster içi mantıksal izolasyon) |
| Ortalama Provizyon Süresi (30 kaynak için) | 1m 45s | 2m 10s | 45s (Pod seviyesinde ise) |
Trade-off Analizi: Eğer uygulamanız sadece stateless mikroservislerden oluşuyorsa ve yönetilen veritabanlarına (RDS/ElastiCache) ihtiyaç duymuyorsa, Kubernetes üzerinde vcluster veya ayrı namespace’ler açmak provizyon süresini 45 saniyelere kadar düşürür. Ancak production ortamı birebir kopyalanmak isteniyorsa (örneğin AWS SQS kuyrukları, DynamoDB tabloları ve RDS PostgreSQL) Pulumi Automation API, Terraform’a kıyasla TypeScript/Go entegrasyonu sayesinde CI/CD sürecinde çok daha ince kontrollü (fine-grained) hata yakalama imkanı sunar.
Production Vaka İncelemesi: Zombi Stack’ler ve Fatura Şokları
Teoride, GitHub Actions üzerindeki on: [closed] tetikleyicisinin tüm altyapıyı temizlemesi beklenir. Ancak 2023’ün ilk çeyreğinde yönettiğim 40 mikroservisli bir projede, GitHub Actions runner’larının ağ kesintisi yaşaması veya geliştiricilerin PR’ları kapatmadan haftalarca bekletmesi sonucunda 143 adet orphan (zombi) PR ortamı aktif kalmıştı. Bu durum, arka planda çalışan RDS t4g.micro instance’ları ve Application Load Balancer’lar (ALB) nedeniyle 72 saatlik bir hafta sonu periyodunda 4200 USD’lik beklenmedik bir AWS faturasına yol açtı.
Bu vakadan sonra sadece CI/CD pipeline’ına güvenmeyi bırakıp, AWS tarafında ikincil bir güvenlik önlemi (fallback) uyguladık. Pulumi koduna zorunlu bir etiketleme (tagging) mekanizması ekledik:
const defaultTags = {
Environment: `pr-${prNumber}`,
ManagedBy: "Pulumi",
TtlExpireAt: new Date(Date.now() + 48 * 60 * 60 * 1000).toISOString() // 48 saat kuralı
};
Ardından AWS EventBridge ve bir Lambda fonksiyonu kullanarak, saat başı çalışan bir Reaper (Tırpan) mekanizması kurduk. Lambda fonksiyonu TtlExpireAt zaman damgası geçmiş tüm kaynakları tarıyor, Pulumi Automation API’yi serverless ortamda çağırarak (veya doğrudan AWS SDK ile) ilgili stack’leri zorla siliyordu. Bu mimari güncelleme sonrası, açık unutulan PR ortamlarından kaynaklanan israf %100 oranında engellendi.
Production Önerileri
Geçici PR ortamlarını production kalitesinde yönetmek için aşağıdaki checklist kesinlikle uygulanmalıdır:
- Ayrı AWS Hesabı Kullanımı: PR ortamları için production hesabından tamamen izole edilmiş, ayrı bir AWS hesabı (Organizational Unit) tahsis edin. IAM limitleri veya Service Quota aşımları production trafiğini etkilememelidir.
- Spot Instance Tercihi: Veritabanı ve container çalıştırma maliyetlerini minimize etmek için AWS Fargate Spot veya EC2 Spot instance’ları kullanın. Fargate Spot kullanımı hesaplama maliyetlerinde tam %68 oranında tasarruf sağlar.
- Veritabanı Seeding (Tohumlama): PR veritabanını boş bırakmayın. PostgreSQL kullanıyorsanız,
pg_dumpile alınmış ve maskelenmiş (anonymized) 10 MB’lık bir seed SQL dosyasını, Pulumi’ninCommandprovider’ı üzerinden veya bir init container ile veri tabanına yükleyin. EXPLAIN ANALYZE testlerinin doğru çalışması için tablo istatistiklerinin (statistics) gerçeğe yakın olması şarttır. - State Dosyası Koruması: Pulumi state dosyalarını barındıran S3 bucket’ında mutlaka Versioning (Sürümleme) ve DynamoDB ile State Locking mekanizmasını aktif edin. S3 Sürümleme, bozulan state dosyalarını 1 dakika içinde eski haline getirmeyi sağlar.
Sık Sorulan Sorular
S3 Backend kullanırken “conflict/lock” hatası alıyorum, nasıl çözerim?
Eğer aynı PR’a arka arkaya 2 commit atılırsa, CI/CD pipeline’ı iki defa tetiklenir ve ilk süreç state’i kilitlediği için ikincisi başarısız olur. Automation API kullanırken, stack.up() çağırmadan önce GitHub Actions tarafında eşzamanlı çalışmaları (concurrency) kısıtlamanız gerekir. YAML dosyanıza concurrency: group: pr-${{ github.event.pull_request.number }} cancel-in-progress: true ekleyerek eski pipeline’ı otomatik iptal edebilirsiniz.
Pulumi Automation API uygulamanın Docker imajına dahil edilmeli mi?
Kesinlikle hayır. Automation API altyapı kodunu yöneten CI/CD operasyonel aracınızdır. Production ortamında çalışan uygulamanızın (Node.js/Go) içerisine Pulumi SDK’sını gömmek hem güvenlik açığı yaratır hem de imaj boyutunu (image size) 250 MB’a kadar şişirir. Ayrı bir scripts dizininde barındırılmalı ve sadece runner üzerinde çalıştırılmalıdır.
Geçici ortamlar için RDS mi yoksa ECS üzerinde container DB mi kullanmalıyım?
Eğer test süreniz 10 dakikanın altındaysa ve PR sadece mantıksal testler (unit/integration) içeriyorsa, geçici bir ECS görevinde (task) PostgreSQL imajı çalıştırmak RDS ayağa kaldırmaktan (yaklaşık 4-7 dakika) çok daha seridir (yaklaşık 25 saniye). Veri kalıcılığına ihtiyaç duyulmayan bu senaryoda container tabanlı veritabanı %85 oranında AWS maliyet düşüşü sağlar.
Sonuç
Pulumi Automation API ile PR bazlı izole ortamlar oluşturmak, ekiplerin birbiriyle çakışmadan altyapı değişikliklerini test edebilmesini sağlayan ve mühendislik eforunu doğrudan kod kalitesine kanalize eden kritik bir süreçtir. Geleneksel CLI wrapper’larının getirdiği kırılganlıkları ortadan kaldıran bu programatik yaklaşım, state yönetimini doğrudan TypeScript veya Go’nun hata yakalama mekanizmalarıyla koruma altına alır.
Organizasyonunuzda bu geçişi başlatmak için atılacak ilk somut adım; production hesaplarından izole edilmiş bir AWS “Sandbox” hesabı oluşturmak ve mevcut staging ortamını kopyalayacak minimal bir Pulumi Automation projesini sadece bir takımın PR süreçlerine entegre etmektir. Etiketleme (tagging) ve zaman tabanlı otomatik yok etme (reaper) mekanizmalarını baştan kurarak bütçe güvenliğini garanti altına almayı unutmayın.
Bunları da beğenebilirsiniz

TensorRT 8.6 Explicit Quantization: Production Modellerinde INT8 Hassasiyet Kayıplarını İzole Etme
TensorRT 8.6’da ONNX GraphSurgeon ve Polygraphy kullanarak Explicit Quantization ile INT8 aktivasyon sapmalarını nasıl izole edeceğinizi teknik detaylarıyla inceleyin.

Web Uygulamalarında RAG Tabanlı Yapay Zeka Entegrasyonu: Güvenli Dağıtım ve Vektör Veritabanı Optimizasyonları Rehberi
Web uygulamalarınıza RAG (Retrieval Augmented Generation) tabanlı yapay zekayı güvenli bir şekilde entegre etme ve vektör veritabanlarını optimize etme stratejilerini keşfedin. Kullanıcı deneyimini zenginleştirirken güvenlik ve performans sağlamanın yollarını öğrenin.

Repository Seviyesinde AI Ajanları ile Otonom Kod İnceleme: Dağıtık İzleme Verilerini Değişim Yönetimine Entegre Etme Rehberi
Modern yazılım geliştirme süreçlerinde AI ajanlarını ve dağıtık izleme verilerini kullanarak otonom kod inceleme sistemleri kurmanın teknik detaylarını ve stratejik avantajlarını keşfedin.