SNS/SQS Cross-Account Fan-Out: AWS'de Multi-Account Event Dağıtımı
Amazon SNS ve SQS kullanarak güvenli cross-account event dağıtımı nasıl yapılır öğrenin. IAM policy'leri, KMS şifreleme, AWS CDK implementasyonu ve production'da karşılaşılan yaygın sorunları kapsıyor.
Özet
Cross-account SNS/SQS fan-out, AWS hesap sınırları arasında güvenli event dağıtımı sağlıyor. Bu mimari pattern, bir hesaptaki tek bir SNS topic'in, farklı hesaplardaki birden fazla SQS queue'ya mesaj göndermesini sağlarken, yönetimsel izolasyonu koruyarak event-driven iletişimi mümkün kılıyor. Bu rehber, IAM policy'leri, KMS şifreleme, AWS CDK kurulumu ve production'da ortaya çıkan yaygın sorunların troubleshooting'ini içeriyor.
Cross-Account Fan-Out Neden Önemli
Multi-account AWS Organizations ile çalışmak bana düzgün event dağıtımının organizasyonel ölçek için ne kadar önemli olduğunu gösterdi. Farklı ekipler, servisler veya environment'lar için ayrı hesaplarınız varsa, güvenlik sınırlarından ödün vermeden event'leri paylaşmanın bir yoluna ihtiyacınız oluyor.
SNS/SQS fan-out pattern'i birkaç gerçek problemi çözüyor:
Yönetimsel izolasyon: Her hesap kendi kaynaklarını bağımsız olarak kontrol ediyor. Billing ekibi, fulfillment ekibinin altyapısını yanlışlıkla silemez - her ikisi de aynı kaynaktan event alsalar bile.
Bağımsız scaling: Consumer hesaplar SQS processing'lerini bağımsız olarak scale ediyorlar. Bir yavaş consumer diğerlerini etkilemiyor - mesajlar kendi hesaplarında kuyruklanırken diğerleri işlemeye devam ediyor.
Maliyet verimliliği: SNS'den SQS'e delivery ücretsiz (sadece SNS publish'ler ve SQS operasyonları için ödeme yapıyorsun). HTTP endpoint'ler veya diğer entegrasyon metodlarıyla karşılaştırıldığında, bu scale'de önemli maliyet tasarrufu sağlıyor.
Güvenlik sınırları: Her hesap kendi şifreleme, access policy'leri ve compliance kontrollerini implement ediyor. Security ekibi kendi hesabında sıkı key management uygulayabilir, publisher'da değişiklik gerektirmeden.
Mimari Genel Bakış
Cross-account fan-out pattern'i nasıl çalışıyor:
Pattern üç seviyede doğru konfigürasyon gerektiriyor:
- SNS topic policy: Cross-account
sns:Subscribeizni veriyor - SQS queue policy: SNS service principal'ının
sqs:SendMessageyapmasına izin veriyor - KMS key policy (şifreli ise): SNS'in mesajları şifrelemesine/çözmesine izin veriyor
IAM Policy'leri ve İzinler
Cross-account izinleri doğru yapmak kritik. Güvenilir şekilde çalışan yaklaşımı paylaşıyorum.
SNS Topic Policy (Publisher Account)
SNS topic açıkça hedef hesaplara sns:Subscribe izni vermelidir:
Önemli noktalar:
- Organization-wide erişim için
AccountPrincipal, spesifik roller içinArnPrincipalkullan sns:Subscribeaction'ı subscription oluşturmak için gerekli- Bu policy mesaj yayınlama izni vermiyor - sadece subscription oluşturma
- Kaynak VPC, IP aralığı veya diğer faktörlere göre kısıtlamak için condition'lar ekleyebilirsin
SQS Queue Policy (Consumer Account)
Her consumer hesap, SNS service principal'ının mesaj göndermesine izin veren bir queue policy'sine ihtiyaç duyuyor:
Önemli detaylar:
aws:SourceArnileConditiondiğer SNS topic'lerin queue'na göndermesini engelliyorrawMessageDelivery: falsemesajı SNS metadata'sıyla sarıyor (debugging için öneriliyor)rawMessageDelivery: trueyap eğer sadece SNS envelope olmadan mesaj body'si istiyorsan- Long polling (
receiveMessageWaitTime) boş receive'leri ve maliyeti azaltıyor
İki Yönlü El Sıkışma
Cross-account subscription'lar her iki hesabın da anlaşmasını gerektiriyor:
- Publisher subscription'a izin veriyor: SNS topic policy consumer hesaba
sns:Subscribeveriyor - Consumer mesajları kabul ediyor: SQS queue policy SNS service principal'ının mesaj göndermesine izin veriyor
- Consumer subscription oluşturuyor: Queue owner topic ARN kullanarak
sns:Subscribeçağırıyor
Bu iki yönlü el sıkışma kritik. Eğer policy'lerden biri eksikse, "Access Denied" hataları alırsın. Subscription başarısızlıklarında troubleshooting yaparken her iki tarafı da kontrol etmeyi öğrendim.
KMS Şifreleme Konfigürasyonu
Şifreleme cross-account setup'lara karmaşıklık ekliyor. AWS-managed key'ler hesap sınırları arasında çalışmıyor - customer-managed key kullanmalısın.
AWS-Managed Key'ler Neden Çalışmıyor
AWS-managed key (alias/aws/sqs) kullanarak şifreli bir SQS queue oluşturduğunda, key policy sadece o hesap içinde izinler veriyor. Publisher hesaptaki SNS servisi, consumer hesabın AWS-managed key'ini kullanamıyor.
Customer-Managed Key Kurulumu
Şifreli queue'lar için çalışan bir pattern:
Key policy gereksinimleri:
kms:Decrypt: SNS queue'ya gönderirken mesajları decrypt etmek için buna ihtiyaç duyuyorkms:GenerateDataKey: Envelope encryption için gereklikms:ViaServicecondition: Key kullanımını belirli region'daki SQS servisine kısıtlıyor- Güvenlik best practice'leri için key rotation'ı aktif et
Maliyet Değerlendirmesi
Customer-managed KMS key'ler key başına ayda 0.03'e mal oluyor. Cross-account senaryolar için bu gerekli - ücretsiz alternatif yok.
Maliyet Optimizasyonu için Mesaj Filtreleme
SNS subscription filter'ları istenmeyen mesajların queue'lara ulaşmasını önleyerek maliyetleri azaltıyor. Filtreleme SQS ücretleri uygulanmadan önce SNS seviyesinde gerçekleşiyor.
Attribute-Based Filtreleme
Mesaj attribute'ları basit, verimli filtreleme sağlıyor:
Payload-Based Filtreleme
Daha yeni payload-based filtreleme (2024'te tanıtıldı) mesaj body'sinin kendisinde filtrelemeye izin veriyor:
Filter policy faydaları:
- Tipik senaryolarda SQS istek maliyetlerini %50-90 azaltıyor
- Her subscriber sadece ilgili mesajları alıyor
- Filter değişiklikleri yayılması 15 dakika kadar sürebiliyor
- Topic başına 200'e kadar filter policy
FIFO Topic'ler ve Queue'lar
FIFO (First-In-First-Out) topic'ler kesin sıralama ve tam bir kez delivery sağlıyor. Mesaj sırası önemli olduğunda kullan.
FIFO Ne Zaman Kullanılmalı
FIFO şu durumlarda mantıklı:
- Sıranın önemli olduğu sipariş işleme workflow'ları
- Tam bir kez işleme gerektiren finansal işlemler
- Sırasıyla gerçekleşmesi gereken state machine geçişleri
- Sıranın nihai durumu etkilediği envanter güncellemeleri
FIFO Kurulum Gereksinimleri
FIFO topic'lere yayınlama:
High-throughput mode değerlendirmeleri:
- Default FIFO: Topic seviyesinde deduplication ile 300 TPS
- High-throughput mode: Mesaj grubu seviyesinde deduplication ile 30.000 TPS (Ocak 2025'te artırıldı)
- Aktif edildikten sonra geri alınamaz
- Processing'i paralel hale getirmek için birden fazla mesaj grubu kullan
Yaygın Hatalar ve Çözümler
Production'da karşılaştığım sorunlar ve çözümleri.
Hata 1: Subscription "PendingConfirmation" Gösteriyor
Belirti: Subscription oluşturuldu ama "PendingConfirmation" durumunda takılı kaldı. Mesajlar akmıyor.
Kök neden: Topic owner subscription'ı oluşturduğunda (queue owner yerine), SNS manuel olarak onaylanması gereken bir confirmation mesajı gönderiyor.
Çözüm: Her zaman queue owner'ın subscription oluşturmasını sağla:
Eğer topic owner subscription oluşturmalıysa, onayı otomatikleştir:
Hata 2: KMS Key Access Denied
Belirti: Mesajlar SNS'e yayınlanıyor ama şifreli SQS queue'da hiç görünmüyor. SNS metriklerinde hata yok.
Kök neden: SNS servisi KMS key'i şifreleme için kullanma iznine sahip değil.
Çözüm: KMS key policy'nin SNS'e gerekli izinleri verdiğini doğrula:
Troubleshooting ipucu: KMS AccessDenied hataları için CloudTrail loglarını kontrol et:
Hata 3: Region Uyuşmazlığı
Belirti: Doğru policy'lere rağmen "Access Denied" hataları.
Kök neden: SNS topic farklı region'da, SQS queue başka region'da. Cross-region direct subscription'lar cross-account senaryolar için desteklenmiyor.
Çözüm: SNS topic ve SQS queue'ları aynı region'da tut. Multi-region gereksinimler için SNS'den Lambda forwarder'lar kullan:
Hata 4: Mesaj Boyutu Limitleri
Belirti: Bazı mesajlar başarıyla gönderiliyor, diğerleri sessizce kayboluyor.
Kök neden: SNS ve SQS'in her ikisinde de 256 KB mesaj boyutu limiti var. Bu limiti aşan mesajlar bildirim olmadan düşürülüyor.
Çözüm: Mesajları 256 KB altında tut veya büyük payload'lar için S3 kullan:
Hata 5: Filter Policy'ler Etkili Olmuyor
Belirti: Filter policy'ye rağmen mesajlar hala gönderiliyor.
Kök neden: Filter policy'lerin yayılması 15 dakika kadar sürebiliyor, veya mesaj attribute'ları filter formatıyla eşleşmiyor.
Çözüm: Yayılmayı bekle ve attribute formatını doğrula:
Monitoring ve Observability
Cross-account mesajlaşma için etkili monitoring önemli. Hem publisher hem de consumer taraflarında görünürlüğe ihtiyacın var.
Önemli SNS Metrikleri
Önemli SQS Metrikleri
Cross-Account CloudWatch Observability
Hesaplar arası birleşik monitoring için CloudWatch Observability Access Manager kullan:
Bu, veri transfer maliyeti olmadan (aynı region içinde) tüm hesaplardan metrikleri gösteren tek bir dashboard sağlıyor.
Maliyet Analizi
Maliyetleri anlamak mimarini optimize etmene yardımcı oluyor.
Fiyatlandırma Dökümü (2025)
SNS maliyetleri:
- İlk 1 milyon istek/ay: ÜCRETSİZ
- Free tier'ın üstünde: Milyon yayın başına $0.50
- SNS'den SQS'e delivery: ÜCRETSİZ (büyük maliyet avantajı)
SQS maliyetleri:
- İlk 1 milyon istek/ay: ÜCRETSİZ
- Standard queue: Milyon istek başına $0.40
- FIFO queue: Milyon istek başına $0.50
- Her 64 KB chunk = 1 istek (256 KB mesaj = 4 istek)
Fan-out maliyet örneği (4 queue'ya 1 milyon mesaj):
- SNS yayınları: 1M × 0.50
- SNS'den SQS'e delivery: ÜCRETSİZ
- SQS alımları: 4M × 1.60
- SQS silmeleri: 4M × 1.60
- Toplam: $3.70
%50 mesaj filtreleme ile:
- SNS yayınları: 1M × 0.50
- Filtreli delivery'ler: 2M mesaj gönderildi
- SQS alımları: 2M × 0.80
- SQS silmeleri: 2M × 0.80
- Toplam: $2.10 (%43 maliyet azalması)
KMS maliyetleri (şifreli queue'lar için):
- Customer-managed key: Key başına ayda $1
- KMS istekleri: 10.000 istek başına $0.03
- Her şifreli mesaj 2 KMS isteği oluşturuyor
Maliyet Optimizasyon Stratejileri
- Mesaj filtreleme uygula: Tipik senaryolarda %50-70 maliyet azalması
- SQS long polling'i aktif et: Boş alımları %90 azaltıyor
- Batch operasyonlarını kullan: API çağrılarında 10 kata kadar azalma
- Mesajları 64 KB altında tut: Multi-request ücretlerinden kaçın
- Sıralama kritik değilse Standard queue kullan: FIFO'dan %20 daha ucuz
Alternatif Yaklaşımlar
SNS/SQS fan-out her zaman en iyi seçim değil. İşte alternatifler ve ne zaman düşünüleceği.
EventBridge
Ne zaman kullanılmalı:
- Karmaşık event routing gerekiyor (100+ kural)
- Schema registry ve validasyon gerekli
- Event replay yeteneği önemli
- 30+ AWS servisiyle entegrasyon
Değişim değerlendirmeleri:
- Milyon event başına 0.50'ye karşı)
- JSONPath benzeri syntax ile daha güçlü filtreleme
- Yerleşik schema discovery ve validation
- Native cross-account event bus'ları
Kinesis Data Streams
Ne zaman kullanılmalı:
- Sıralı stream processing gerekiyor
- Replay yeteneği gerekli (365 güne kadar)
- Farklı hızlarda okuyan birden fazla consumer
- Real-time analytics kullanım alanları
Değişim değerlendirmeleri:
- Daha pahalı (shard saat başına $0.015 + PUT maliyetleri)
- Karmaşık shard yönetimi
- Discrete event'lerden çok streaming analytics için daha iyi
- Daha yüksek operasyonel yük
Direkt Lambda Invocation
Ne zaman kullanılmalı:
- Synchronous processing kabul edilebilir
- Event hacmi Lambda concurrent execution limitlerinin altında
- Queue yönetimine gerek yok
- Basit, hızlı processing mantığı
Değişim değerlendirmeleri:
- Yerleşik retry queue'ları yok
- Cold start değerlendirmeleri
- Lambda concurrency ile sınırlı
- Scaling için queue'lardan daha az esnek
Gerçek Dünya Implementation Pattern'i
İşte production-ready, eksiksiz bir multi-account kurulum:
Önemli Çıkarımlar
Cross-account SNS/SQS ile çalışmak bana birkaç önemli ders verdi:
Şifreli cross-account queue'lar için her zaman customer-managed KMS key kullan. AWS-managed key'ler hesap sınırları arasında çalışmıyor. Key başına ayda $1 kaçınılmaz.
Subscription'ları queue owner oluştursun. Bu, manuel onay adımını ortadan kaldırıyor ve kurulum karmaşıklığını azaltıyor. Topic owner subscription oluşturduğunda, confirmation mesajlarını işlemek için otomasyona ihtiyacın oluyor.
Baştan comprehensive monitoring implement et. Cross-account troubleshooting düzgün CloudWatch metrikleri olmadan önemli ölçüde daha zor. Hem publisher hem de consumer hesaplarında alarm kur.
SNS seviyesinde subscription filter'larla filtrele. Bu tipik senaryolarda maliyetleri %50-90 azaltıyor. Filtreleme SQS ücretleri uygulanmadan önce gerçekleşiyor, bu da onu maliyet açısından oldukça etkili yapıyor.
SNS topic'leri ve SQS queue'ları aynı region'da tut. Cross-region subscription'lar önemli karmaşıklık ekliyor. Multi-region dağıtıma ihtiyacın varsa, Lambda forwarder'ları kullan.
DLQ'lar subscriber account'ta olmalı. Cross-account subscription'lar için publisher hesabından bir DLQ kullanamazsın. Her consumer hesabın kendi DLQ'su olmalı.
15 dakikalık filter policy yayılmasını planla. Filter policy'leri güncellerken hemen değişiklik bekleme. Değişiklikleri önce non-production'da test et.
SNS/SQS fan-out pattern'i AWS hesapları arasında güvenilir, maliyet etkin event dağıtımı sağlıyor. Bağımsız consumer scaling'i ile persistent queue'lara ve güçlü yönetimsel sınırlara ihtiyacın olduğunda, bu mimari mükemmel sonuçlar veriyor. İzin modelini ve şifreleme gereksinimlerini anladıktan sonra implementation karmaşıklığı yönetilebilir.