CloudFormation'un 500 Kaynak Sınırını Aşmak: Büyük Ölçekli Altyapı için Pratik Stratejiler
Nested stack'ler, cross-stack referanslar, SSM Parameter Store ve microstack mimarisi kullanarak CloudFormation'un 500 kaynak sınırını aşmak için kanıtlanmış stratejiler. TypeScript CDK örnekleri ve karar çerçeveleri ile.
Özet
AWS CloudFormation'un stack başına 500 kaynak sınırı, production-grade altyapı geliştirirken sıkça karşılaşılan sabit bir kısıtlamadır. Bu sınırla çalışmak bana gösterdi ki, nested stack'ler, cross-stack referanslar, SSM Parameter Store ve microstack mimarisi arasındaki seçim operasyonel tercihlere, deployment patternlerine ve takım yapısına bağlıdır. Bu yazıda beş stratejiyi TypeScript CDK örnekleri, karar çerçeveleri ve bu sınırı aşan altyapıları yeniden yapılandırırken öğrendiğim derslerle paylaşıyorum.
500 Kaynak Sınırını Anlamak
CloudFormation her stack'i maksimum 500 kaynakla sınırlandırıyor; service quota'larla artırılamayan sabit bir limit. Bu kısıtlama CloudFormation'un dahili işleme gereksinimleri nedeniyle var: bağımlılık grafiği karmaşıklığı, rollback operasyon yönetimi ve state senkronizasyonu kaynak sayısı arttıkça exponential olarak artıyor.
Takımlar Bu Limiti Ne Zaman Vuruyor?
Serverless Microservices: Tek bir Lambda function 8-12 CloudFormation kaynağı oluşturuyor:
Production vs Development Farkı: 200 kaynaklı development environment'lar sorunsuz çalışıyor, ama production redundancy, monitoring ve multi-AZ configuration ekliyor:
Kaynak Sayısını Takip Etmek
Limite çarpmadan önce proaktif olarak kaynak sayını izle:
Strateji 0: Kaynak Konsolidasyonu - Ayırmadan Önce Azalt
Stack'leri ayırmadan önce kaynakları konsolide ederek toplam sayıyı azalt. Bu senin ilk adımın olmalı; stack ayırmak operasyonel karmaşıklık ekliyor, konsolidasyon seni limitin altına indirirse bunu tercih et.
Konsolidasyonu Ne Zaman Kullanmalı?
- Stack splitting'i düşünmeden önce ilk adım olarak
- Paylaşılabilecek benzer kaynaklarınız olduğunda
- 500 kaynak limitine çarpmadan önce (proaktif optimizasyon)
- Operasyonel overhead ve maliyetleri azaltmak için
Pattern 1: Function Başına Role Yerine Shared IAM Role'ler
Pattern 2: Shared Security Group'lar
Pattern 3: Aggregate CloudWatch Alarm'lar
Konsolidasyon Etkisi Örneği
Konsolidasyonun Trade-off'ları
Avantajları:
- Önemli kaynak sayısı azalması (genellikle %50-70 mümkün)
- Daha basit IAM yönetimi (audit edilecek daha az role)
- Daha hızlı deployment'lar (oluşturulacak/güncellenecek daha az kaynak)
- Azalan CloudFormation template boyutu
Dezavantajları:
- Güvenlik: Shared role'ler daha geniş permission'lara sahip (least privilege ihlalleri)
- Blast radius: Role değişikliği onu kullanan tüm kaynakları etkiliyor
- Debugging: Sorunları belirli function'lara trace etmek zorlaşıyor
- Compliance: Separation of concerns gereksinimlerini ihlal edebilir
- Rollback: Bir service için permission'ları bağımsız olarak geri alamazsın
Konsolidasyon için Karar Çerçevesi
Best Practice: Stack splitting'den önce konsolidasyonla başla. Konsolidasyon ile 600'den 400 kaynağa düşebiliyorsan, stack ayırmana gerek kalmayabilir.
Strateji 1: Nested Stack'ler - Resmi Çözüm
Nested stack'ler parent stack'in içinde her biri 500 kaynağa kadar olan birden fazla child stack barındırmasına izin veriyor. Nested stack parent stack'te tek kaynak olarak sayılıyor.
Ne Zaman Kullanmalı?
- Altyapı mantıksal olarak farklı domain'lere bölünüyor (networking, compute, storage, monitoring)
- Tüm kaynaklar tek birim olarak deploy olup rollback oluyor
- Tek deployment operasyonu tercih ediliyor
- Takım altyapıyı merkezi kontrol noktasından yönetiyor
CDK Implementation
Deployment Süreci
Avantajlar ve Limitasyonlar
Avantajları:
- Tek deployment operasyonu
- Atomik rollback - ya hepsi ya hiçbiri
- Domain'e göre mantıksal organizasyon
- Her nested stack 500 kaynak budget'ına sahip
- Parent stack sadece nested stack'leri sayıyor (örnekte 3 kaynak)
Limitasyonları:
-
Changeset'ler Opak Oluyor: CloudFormation changeset sadece parent-level değişiklikleri gösteriyor, nested stack'lerin içinde ne değiştiğini göstermiyor.
-
Drift Detection Karmaşıklığı: Her nested stack'i ayrı ayrı kontrol etmek gerekiyor, sonuçları aggregate etmek için custom script lazım.
-
Nested Stack Update Failure'ları Stuck State'ler Yaratıyor: Bir nested stack update fail olup resource deletion'ı beklerken takılı kalırsa, tüm parent stack bekliyor, tüm deployment'ları blokluyor.
-
2500 Kaynak Operasyon Limiti: Nested stack'lerle bile, tek deployment operasyonu toplamda 2500 kaynakla sınırlı.
-
Bağımsız Deploy Edilemiyor: Ayrı nested stack'leri deploy edemezsin; her zaman parent üzerinden deploy etmen gerekiyor.
Strateji 2: Cross-Stack Referanslar - Bağımsız Deployment
Çıktıların açık export/import'u ile birden fazla bağımsız stack farklı takımların farklı altyapı componentlerini yönetmesine izin veriyor.
Ne Zaman Kullanmalı?
- Takımlar altyapı componentlerini bağımsız deploy etmek istiyor
- Componentler için farklı lifecycle (networking nadiren değişiyor, compute sık değişiyor)
- Birden fazla takım altyapının farklı parçalarını yönetiyor
- Kaynakları birden fazla consuming stack arasında paylaşman gerekiyor
CDK Implementation
Deployment Süreci
Kritik Limitasyon - Export Update Lock
En önemli limitasyon: Export başka bir stack tarafından import ediliyorken güncellenemez veya silinemez.
Trade-off Özeti
- Pro: Bağımsız deployment
- Pro: Takım özerkliği
- Con: Export değişiklikleri consuming stack'lerin silinmesini gerektiriyor
- Con: Daha karmaşık bağımlılık yönetimi
- Con: İlgili altyapı genelinde atomik güncellemeleri sağlamak zorlaşıyor
Strateji 3: SSM Parameter Store - Gevşek Coupling
AWS Systems Manager Parameter Store kullanarak stack'ler arası değer paylaşımı, sabit cross-stack referanslarından kaçınmaya izin veriyor.
Ne Zaman Kullanmalı?
- Stack bağımlılıkları olmadan paylaşılan değerleri güncelleme esnekliği gerekiyor
- Provider ve consumer stack'lerini ayırmak istiyorsun
- Birden fazla stack aynı değerleri consume ediyor
- Cross-region deployment'lar (parameterlar replicate edilebilir)
CDK Implementation
Deployment Süreci
Avantajlar ve Trade-off'lar
Avantajları:
- Cross-stack export lock'ları yok
- Consumer'ları etkilemeden provider stack'i güncelle
- Birden fazla stack aynı parametreleri okuyabilir
- Cross-region replication mümkün
- Rollback için versioned parameterlar kullanılabilir
Trade-off'ları:
valueFromLookupcdk.context.json'da cache'leniyor - eski kalabilirvalueForStringParameterdeploy time'da resolve oluyor - daha az type-safe- Runtime parameter okumaları Lambda execution time'ına ekliyor
- SSM read access için IAM permission'ları gerekiyor
- Deployment'tan önce parameterların var olması gerekiyor (veya default değerler kullan)
Strateji 4: Birden Fazla Bağımsız Stack - Microservice Pattern
Tek CDK app birden fazla bağımsız stack oluşturuyor, mantıksal olarak organize ama coupling yok.
Ne Zaman Kullanmalı?
- Microservice mimarisi - her service bağımsız stack
- Service'ler için farklı deployment schedule'ları
- Service bazında takım sahipliği
- Her service 500 kaynağın altında
- Deployment esnekliği ile mono-repo organizasyonu istiyorsun
CDK Implementation
Deployment Seçenekleri
Trade-off'lar
Avantajları:
- Tam deployment bağımsızlığı
- Her service takımı kendi stack'ine sahip
- Diğer service'leri etkilemeden sık deploy et
- Takımlar arası development'ı scale et
- Yeni service eklemek kolay
- Net service sınırları
Dezavantajları:
- Shared altyapı yok (SSM/lookup kullanılmazsa VPC, networking duplike ediliyor)
- Service discovery mekanizması gerekiyor (SSM, EventBridge, service mesh)
- Yönetilecek daha fazla stack (5 service = 5 stack)
- Multi-service deployment'lar için orkestrasyon gerekiyor
Karar Çerçevesi
Operasyonel gereksinimler ve takım yapısına göre stratejini seç:
Nested Stack'leri Ne Zaman Seçmeli:
- Altyapı tek birim olarak deploy ediliyor
- Atomik rollback önemli
- Mantıksal domain ayrımı (network/compute/storage)
- Tek takım tüm altyapıyı yönetiyor
- Deployment sıklığı: Düşük-orta
Cross-Stack Referansları Ne Zaman Seçmeli:
- Altyapı katmanları için farklı lifecycle
- Networking nadiren değişiyor, compute sık değişiyor
- Farklı takımlar farklı katmanlara sahip
- Export update karmaşıklığını tolere edebilirsin
- Deployment sıklığı: Orta
SSM Parameter Store'u Ne Zaman Seçmeli:
- Maksimum deployment esnekliği gerekiyor
- Katı bağımlılıklar olmadan altyapıyı güncelle
- Cross-region deployment'lar
- Aynı değerlerin birden fazla consumer'ı var
- Deployment sıklığı: Yüksek
Birden Fazla Bağımsız Stack'i Ne Zaman Seçmeli:
- Microservice mimarisi
- Takım özerkliği kritik
- Service'ler < 500 kaynak
- Event-driven iletişim
- Deployment sıklığı: Çok yüksek (service başına)
Yaygın Tuzaklar ve Çözümler
Tuzak 1: Kaynak Sayısını Proaktif İzlememek
Stack eşiği aşarsa build'i fail eden CI/CD check'i implement et:
Tuzak 2: Acil Durumda Cross-Stack Export Lock
Problem: Kritik production sorunu networking değişikliği gerektiriyor, ama cross-stack export güncellemeyi engelliyor.
Çözüm: Değişmesi muhtemel altyapı için SSM Parameter Store kullan:
Tuzak 3: Nested Stack Bağımlılık Döngüleri
Nested stack'leri net hiyerarşide tut. Child stack'teki kaynaklar asla parent stack kaynaklarına referans vermemeli.
Tuzak 4: Rollback Davranışını Test Etmemek
Development'ta kasıtlı failure'lar yaratarak rollback'i test et:
Önemli Çıkarımlar
-
500 Kaynak Limiti Sabit: Service quota artırımı mümkün değil. Baştan mimariyi buna göre planla.
-
Konsolidasyonla Başla: Stack'leri ayırmadan önce kaynak sayısını genellikle %50-70 azalt. Shared IAM role'ler, security group'lar ve aggregate alarm'lar kaynak sayısını önemli ölçüde azaltıyor.
-
Nested Stack'ler Operasyonel Karmaşıklığı Basitlikle Değiştiriyor: Tek deployment operasyonu, ama changeset'ler opak oluyor ve drift detection custom tooling gerektiriyor.
-
Cross-Stack Referanslar Export Lock'ları Yaratıyor: Consuming stack'leri silmeden exported değerler güncellenemiyor. Gerçekten sabit kaynaklar için ayır.
-
SSM Parameter Store Maksimum Esneklik Sağlıyor: Gevşek coupling bağımsız deployment ve güncellemelere izin veriyor. Değişebilecek değerler için en iyi seçenek.
-
Birden Fazla Bağımsız Stack Microservice'ler için En İyi: Her service 500 kaynağın altında, bağımsız deploy ediliyor. Event-driven iletişim patternleri gerektiriyor.
-
Kaynak Sayısını Proaktif İzle: CI/CD check'leri 450 kaynağa yaklaşırsa fail olmalı. Production deployment failure'ını bekleme.
-
Hybrid Yaklaşım En Yaygın: Altyapı istikrarı ve değişim sıklığına göre stratejileri birleştir. Sabit foundation'lar cross-stack export kullanır; değişken application'lar SSM kullanır.
-
Rollback Davranışını Test Et: Production sorunları olmadan önce development'ta kasıtlı failure'lar yaratarak rollback davranışını anla.
-
Deployment Sıklığına Göre Strateji Seç: Düşük sıklık → Nested Stack'ler; Orta → Cross-Stack; Yüksek → SSM; Çok Yüksek → Birden Fazla Bağımsız Stack.
CloudFormation'un kaynak limiti ile çalışmak bana gösterdi ki, doğru strateji takımının deployment patternlerine ve operasyonel tercihlerine bağlı. Konsolidasyonla başla, proaktif izle ve altyapının istikrarı ile değişim sıklığına uyan yaklaşımı seç.