AWS Fargate 103: Size Saatler Kazandıracak Production Dersleri
Fargate'i ölçekte çalıştırırken karşılaşılan production olayları. Memory leak'ler, ENI limitleri, subnet arızaları ve işe yarayan debug teknikleri.
Fargate kurulumunuz konusunda kendinize güvendiğiniz, monitoring dashboard'larında her şeyin yeşil göründüğü, sonra da hiç düşünmediğiniz kör noktalar keşfettiğiniz anları bilir misiniz? Production gerçeğine hoş geldiniz.
Fargate workload'larını ölçekte çalıştırmak, tutorial'larda veya basit implementasyonlarda karşılaşmadığınız zorlukları ortaya çıkarır. Memory leak'ler yavaş yavaş task'ları öldürür, ENI limitleri ani scaling sırasında deployment'ları bloke eder—bu bölüm her iki senaryoya da pratik debug yaklaşımları sunuyor. Fargate serimizin önceki bölümlerinde (101, 102) temelleri ve gelişmiş pattern'leri ele aldık. Burada değerli dersler öğreten production senaryoları ve etkili olduğu kanıtlanmış debug yaklaşımları ile çözümleri paylaşıyorum. ENI limitleri ve subnet IP tükenmesi gibi sorunlar sadece peak trafikte ortaya çıkar—bu bölüm bu tuzakları önceden planlamana yardımcı olacak. Her Fargate task'ı bir ENI tüketir; VPC subnet'lerindeki IP aralığı sınırlıdır. Yüksek task sayılarıyla bu limitlere çarpmak an meselesidir. CloudWatch custom metric ile ENI kullanımını izlemek, sorunu production'a varmadan tespit etmeni sağlar. Seride bir sonraki bölüm olan 104'te Infrastructure-as-Code deployment pattern'lerini inceleyeceğiz.
Black Friday'in Büyük ENI Kıtlığı
Kurulum: E-ticaret sitesi, Black Friday trafiği normalin 10 katı bekleniyor. Fargate auto-scaling yapılandırılmış, load test geçti, herkes iyi hissediyor.
Ne Oldu: Şükran Günü 23:47'de, task'larımız şu gizemli hatayla başarısız olmaya başladı:
Fargate task'larımız PENDING durumunda takılı kaldı. Yeni deployment'lar başarısız oldu. Auto-scaling ölçeklenmiyordu. Dashboard her şeyi yeşil gösteriyordu, sadece küçük bir detay dışında: VPC'mizdeki mevcut ENI'lar sıfıra inmişti.
Araştırma
Her Fargate task'ının kendi ENI'ya ihtiyacı olduğunu hatırlıyor musunuz? Peki, 3 availability zone'da 200 task'ımız çalışıyordu ve AWS'nin VPC başına ENI limitleri var. us-east-1'de default VPC için:
- Default ENI limiti: VPC başına 5.000
- Her Fargate task: 1 ENI
- Her RDS instance: 1 ENI
- VPC'deki her Lambda: ENI pool'u paylaşır
- Her ELB: Birden fazla ENI
Limitimizi kontrol ettik:
4.847 ENI'daydık. "Load testing"imiz ENI tüketen diğer servisleri hesaba katmamıştı.
Çözüm (Acil Durum)
Anında çözüm (03:15):
Gerçek çözüm:
- Birden fazla VPC: Workload'ları dev, staging ve prod VPC'lerine böl
- ENI monitoring: ENI kullanımını takip eden CloudWatch custom metric
- Doğru boyutlandırma: Fazla provision edilmiş task'ları azalt
- Lambda optimizasyonu: Mümkün olan Lambda'ları VPC dışına taşı
Öğrenilen dersler:
- Load testing sadece uygulamanızı değil, tüm altyapı bileşenlerini içermeli
- ENI limitleri servis başına değil, VPC başına
- AWS Support sabah 3'te şaşırtıcı derecede hızlı yanıt veriyor
Hain Subnet
Kurulum: Üç private subnet'te Multi-AZ Fargate deployment'ı. Aylarca sorunsuz çalışıyor.
Ne Oldu: Salı sabahı, task'larımızın %40'ı aralıklı bağlantı sorunları göstermeye başladı. Bazı HTTP istekleri başarılı oluyordu, diğerleri 30 saniye sonra timeout'a düşüyordu.
Garip olan kısım? Sadece belirli bir subnet'teki (us-east-1a) task'lar etkileniyordu.
Araştırma Süreci
İlk olarak, açık kontroller:
Task'lar sağlıklı görünüyordu. Network interface'leri bağlı ve aktifti. Ama bir şeyler yanlıştı.
Çıkış noktası: VPC Flow Logs'u etkinleştirdik ve dumanı çıkan silahı bulduk:
Flow log'lar paketlerin subnet'imizden çıktığını ama hedeflerine hiç ulaşmadığını gösterdi. Dönüş paketleri bir yerde drop ediliyordu.
Gerçek Suçlu
Ağ ekibimizin o sabah erkenden subnet'in route table'ını değiştirdiği ortaya çıktı. NAT gateway route'unu 0.0.0.0/0 → nat-gateway-123'ten 0.0.0.0/0 → nat-gateway-456'ya değiştirmişlerdi, Fargate task'larının orada çalıştığını fark etmeden.
Yeni NAT gateway farklı bir AZ'deydi ve farklı security group kurallarına sahipti. Klasik.
Çözüm:
Öğrenilen dersler:
- Route değişikliklerini her zaman production dışında test edin
- Network debugging için VPC Flow Logs dostunuz
- Hangi route table'ların hangi servislere hizmet verdiğini dokümante edin
- Route table değişiklikleri için monitoring kurun
Memory Leak Gizemi (SSH Yok Edisyonu)
Kurulum: Fargate'te çalışan Node.js API, task başına 2GB memory limiti. Haftalarca sorunsuz çalıştı.
Ne Oldu: Memory kullanımı 3-4 saat boyunca yavaşça artıyor, sonra task'lar OOM kill ediliyor. Memory kullanım grafikleri kayak pistine benziyordu.
Ama işin can alıcı yanı: Container'a debug için SSH yapmanın yolu yoktu.
Araştırma Cephaneliği
SSH yapamayacağımız için yaratık olmamız gerekiyor:
1. ECS Exec (kurtarıcımız):
2. Application-level monitoring:
3. Dedektiflik çalışması:
ECS Exec kullanarak debugging araçları yükledik ve HTTP client'ımızın bağlantıları düzgün kapatmadığını bulduk:
Bingo! CLOSE_WAIT durumunda binlerce TCP bağlantısı.
Kök Sebep
Node.js HTTP client kodumuz yeterince masum görünüyordu:
Ama connection pooling veya timeout'ları düzgün yapılandırmıyorduk. Her istek temizlenmeyen yeni bağlantılar yaratıyordu.
Çözüm:
Öğrenilen dersler:
- ECS Exec containerized debugging için paha biçilmez
- HTTP client'ları production'da her zaman düzgün yapılandırın
- Sadece memory değil, file descriptor'ları da izleyin
- "Basit" HTTP client'lar için bile connection pool'lar önemli
30 Saniyelik Connection Timeout Hayaleti
Kurulum: İki Fargate servisi arasında internal servis-servis iletişimi. %99 zaman sorunsuz çalışıyor.
Ne Oldu: Rastgele, isteklerin yaklaşık %1'i tam 30 saniye askıda kalıp sonra connection timeout ile başarısız oluyordu.
Pattern tamamen rastgeleydi. Yük, günün saati veya deployment geçmişi ile korelasyon yoktu.
Debugging Destanı
Network katman araştırması:
Security group'lar iyi görünüyordu. Flow log'lar paketlerin normal akışını gösteriyordu.
Application katman araştırması:
Çıkış Noktası
Log'lar ilginç bir şey gösterdi: başarılı bağlantılar 2-5ms sürüyordu, ama askıda kalanlar tam 30.000ms. Bu rastgele değil - bu bir timeout.
Sonra pattern'i fark ettik: sadece her iki servis aynı availability zone'da olduğunda ve bağlantı load balancer'dan geçtiğinde oluyordu.
Problem: AWS ALB'nin aynı AZ'deki bağlantıların ara sıra load balancer altyapısı üzerinden geri dönebileceği bilinen bir tuhaflığı var ve bu gecikmelere neden oluyor.
Çözüm (birden fazla strateji):
- Aynı AZ için direkt servis iletişimi:
- Connection timeout ayarlaması:
Öğrenilen dersler:
- ALB'ler aynı AZ iletişimi için beklenmedik gecikme ekleyebilir
- Service discovery direkt iletişim pattern'lerini mümkün kılar
- Her zaman SLA'nızdan daha kısa connection timeout'lar uygulayın
- Load balancer'lar her zaman en hızlı yol değildir
Deploy Olmayan Deployment
Kurulum: CodeDeploy kullanarak standart blue-green deployment. Daha önce yüzlerce kez çalıştı.
Ne Oldu: Yeni deployment saatlerce %50'de takılı kaldı. Task'ların yarısı yeni versiyon, yarısı eski versiyon çalışıyordu. CodeDeploy dashboard "In Progress" gösteriyordu, hata mesajı yoktu.
Auto-rollback tetiklenmiyordu çünkü teknik olarak hiçbir şey "başarısız olmuyordu".
Araştırma
CodeDeploy log'ları işe yaramadı:
ECS service event'leri gerçek hikayeyi gösterdi:
Event'ler şunu gösteriyordu:
Kök Sebep
Task execution role'ümüz başka bir ekip tarafından alakasız bir servis için değiştirilmişti ve yanlışlıkla ECS'nin role'ü assume etmesine izin veren trust relationship'i kaldırmışlardı.
Role policy şu şekildeydi:
Şöyle olmalıydı:
Çözüm:
Önleme stratejisi:
Öğrenilen dersler:
- ECS service event'leri CodeDeploy log'larından daha detaylı
- Role trust policy'leri kırılgan ve monitoring gerektirir
- Blue-green deployment'lar limbo'da takılabilir
- İşler gizemli şekilde çalışmayı durdurduğunda her zaman IAM'ı kontrol edin
Gerçekten İşe Yarayan Debug Araç Kutusu
Tüm bu olaylardan sonra, bize sayısız saat kazandıran debugging toolkit'i:
1. Ultimate Fargate Debug Container
2. Monitoring Stack
3. Otomatik Olay Müdahalesi
Fargate Debugging'in Evrensel Yasaları
Tüm bu maceralardan sonra, doğru olan pattern'ler:
-
Task'lar başlamadığında: ENI limitleri, security group'lar ve IAM role'leri kontrol et (bu sırayla)
-
Task'lar yavaş olduğunda: Genelde network'tür (route table'lar, NAT gateway'ler, DNS)
-
Memory sürekli arttığında: Her zaman connection pooling veya event listener'lar
-
Deployment'lar asılı kaldığında: Deployment log'lar değil, service event'leri kontrol et
-
İsteklerin %1'i başarısız olduğunda: Load balancer tuhaflıkları veya cross-AZ sorunları ara
-
Hiçbir şey mantıklı olmadığında: VPC Flow Logs ve ECS Exec'i etkinleştir
Gerçek ders? Fargate bir sürü altyapı karmaşıklığını kaldırır, ama işler ters gittiğinde, temel AWS networking ve compute primitive'lerini anlamanız gerekir. Abstraction sızıntılıdır ve production her zaman sızıntıları bulur.
Bu debugging tekniklerini elinizin altında bulundurun. İnanın, bir gün sabah 3'te ihtiyacınız olacak ve o zaman, önceden kurduğunuz her monitoring endpoint ve teşhis aracı için minnettarlık duyacaksınız.
Bir dahaki sefere biri size serverless container'ların "kur ve unut" olduğunu söylediğinde, onlara bu seriyi gösterin. Production'ın başka planları var, ama artık onlara hazırsınız.
AWS Fargate Derinlemesine Serisi
AWS Fargate'e temellerden production'a tam rehber. Gerçek dünya deneyimleri ile serverless container'ları, maliyet optimizasyonu, debugging tekniklerini ve Infrastructure-as-Code deployment pattern'lerini öğrenin.