AWS API Gateway WebSocket API, istemci ile sunucu arasında kalıcı çift yönlü iletişim kurarak sohbet uygulamaları, canlı bildirimler ve oyun sunucuları gibi gerçek zamanlı senaryoları sunucusuz olarak gerçekleştirmenizi sağlar. Bu yazıda, Lambda fonksiyonlarıyla WebSocket API geliştirirken dikkat edilmesi gereken pratik ipuçlarını ve adım adım izlenecek bir kontrol listesini bulacaksınız.
WebSocket API’nin Temel Bileşenleri
WebSocket API üç ana yönlendirme rotasına sahiptir: $connect (bağlantı kurulduğunda), $disconnect (bağlantı koptuğunda) ve $default (diğer tüm mesajlar). Her birini ayrı Lambda fonksiyonu veya tek bir fonksiyon içinde event tipine göre işleyebilirsiniz. Bağlantı yönetimi için genellikle DynamoDB tablosu kullanılarak bağlantı ID'leri ve meta veriler saklanır.
Pratik İpuçları
- Bağlantı Verilerini DynamoDB’de Saklayın: Her istemci bağlandığında $connect rotasında bağlantı ID'sini, kullanıcı bilgilerini ve bağlantı zamanını bir DynamoDB tablosuna yazın. Böylece $disconnect anında ilgili kaydı silebilir ve hedef kitleye mesaj gönderebilirsiniz.
- callbackURL ile Mesaj Gönderme: Lambda fonksiyonunuzdan belirli bir bağlantıya mesaj iletmek için API Gateway Management API’nin
postToConnectionmetodunu kullanın. Bu işlem için Lambda’nın IAM rolüneexecute-api:ManageConnectionsizni ekleyin. - Zaman Aşımı ve Yeniden Bağlanma: WebSocket bağlantıları 10 dakika boyunca etkinlik olmazsa kapanabilir. İstemci tarafında periyodik ping/pong mekanizması veya yeniden bağlanma mantığı uygulayın. Sunucu tarafında $disconnect tetiklendiğinde DynamoDB’den kaydı temizleyin.
- VPC Entegrasyonu Gerekiyorsa: Lambda fonksiyonunuz bir VPC içinde çalışıyorsa, API Gateway’e bağlanmak için VPC endpoint’i veya NAT Gateway kullanmanız gerekir. Bu durumda AWS VPC Tasarımı ve Alt Ağ Planlaması yazımızdaki önerileri uygulayarak endpoint yapılandırmasını optimize edebilirsiniz.
- Altyapıyı Kodla Yönetin: CloudFormation veya Terraform ile API Gateway, Lambda ve DynamoDB kaynaklarını tanımlayarak tekrarlanabilir dağıtımlar yapın. AWS CloudFormation vs Terraform karşılaştırması, hangi aracın projenize daha uygun olduğuna karar vermenize yardımcı olacaktır.
Adım Adım Kontrol Listesi
1. Planlama ve Tasarım
- Kullanım senaryosunu belirleyin (sohbet, bildirim, vs.).
- Mesaj formatını (JSON) ve protokol detaylarını tanımlayın.
- Kimlik doğrulama yöntemini seçin (Lambda authorizer, Cognito).
2. Kaynakların Oluşturulması
- API Gateway WebSocket API’si oluşturun.
- Lambda fonksiyonlarını (connect, disconnect, default) yazın ve deploy edin.
- DynamoDB tablosu oluşturun (partition key: connectionId).
- API Gateway’de rota entegrasyonlarını Lambda’ya bağlayın.
3. İzin ve Güvenlik
- Lambda IAM rolüne DynamoDB okuma/yazma, API Gateway Management API izinleri ekleyin.
- API Gateway’de CORS ayarlarını yapılandırın (gerekirse).
- Özel etki alanı ve SSL sertifikası ekleyin.
4. Test Etme
- wscat veya Postman WebSocket istemcisi ile bağlantıyı test edin.
- $connect, $disconnect ve $default mesajlarını doğrulayın.
- Mesaj gönderme ve alma işlemlerini kontrol edin.
5. İzleme ve Hata Ayıklama
- CloudWatch Logs ile Lambda hatalarını inceleyin.
- API Gateway CloudWatch Metrics’ten bağlantı sayısı, hata oranını takip edin.
- Bağlantı koptuğunda DynamoDB kaydının temizlendiğinden emin olun.
Sık Yapılan Hatalar ve Çözümleri
- Yetki Hatası (403 Forbidden): Lambda IAM rolüne
execute-api:ManageConnectionseklenmemişse mesaj gönderilemez. Rolü güncelleyin. - Bağlantı Zaman Aşımı: 10 dakika işlemsiz bağlantı kapanır. İstemcide periyodik ping (örneğin her 5 dakikada bir) gönderin.
- DynamoDB Throttling: Çok sayıda eşzamanlı bağlantı varsa tablonuzun okuma/yazma kapasitesini artırın veya Auto Scaling etkinleştirin.
- VPC’de Lambda İnternet Erişimi: VPC içindeki Lambda’nın API Gateway’e (genel) ulaşması için NAT Gateway veya VPC endpoint gerekir. VPC tasarımını doğru yapın.
Performans İpuçları
- Lambda fonksiyonunuzu mümkün olduğunca hafif tutun; beklenen büyük ölçekli yükler için ayrılmış concurrency ayarlayın.
- Mesaj iletiminde batch işlemleri kullanın; birden çok bağlantıya mesaj göndermek için
postToConnectionçağrılarını paralelleştirin. - DynamoDB tablosunda TTL (Time to Live) özelliğini kullanarak eski kayıtları otomatik temizleyin.
- API Gateway için istek/yanıt boyut sınırlarını (varsayılan 1 MB) aşmamaya dikkat edin.
Alternatif Yaklaşımlar
Yayın/abone modeli gerekiyorsa AWS IoT Core veya Amazon SNS ile tekil mesaj iletimi yerine grup mesajlaşması tercih edilebilir. Ancak çift yönlü, düşük gecikmeli iletişim için WebSocket API daha uygundur. Altyapı yönetimini otomatize etmek için IaC araçları ile şablonlar oluşturmanız uzun vadede bakım maliyetini düşürür.
Özet
AWS API Gateway WebSocket API ve Lambda ile gerçek zamanlı uygulama geliştirmek, doğru yapılandırma ve hata yönetimi ile oldukça verimli olabilir. Burada paylaştığımız ipuçları ve kontrol listesi, projenizi sağlam temeller üzerine kurmanıza ve sık karşılaşılan sorunları önceden çözmenize yardımcı olacaktır. Sunucusuz mimarinin esnekliğini ve ölçeklenebilirliğini WebSocket API ile birleştirerek modern kullanıcı deneyimleri sunabilirsiniz.
Sık Sorulan Sorular
AWS WebSocket API için Lambda fonksiyonum hangi izinlere sahip olmalı?
Lambda fonksiyonunuzun IAM rolü, DynamoDB'ye okuma/yazma (bağlantı kayıtları için) ve API Gateway Management API'ye (postToConnection için) execute-api:ManageConnections iznini içermelidir.
WebSocket bağlantıları ne kadar süre canlı kalır?
Varsayılan olarak 10 dakika boyunca hiçbir veri gönderilmezse bağlantı kapanır. Bunu önlemek için istemci tarafından periyodik ping göndermeli veya API Gateway'in varsayılan zaman aşımı süresini yapılandırmalısınız.
VPC içindeki bir Lambda WebSocket API'ye nasıl erişir?
VPC içindeki Lambda, genel API Gateway'e erişmek için bir NAT Gateway veya VPC endpoint (execute-api için) kullanmalıdır. Aksi takdirde bağlantı zaman aşımına uğrar.
DynamoDB tablosunda hangi partition key kullanılmalı?
Bağlantı ID'si (connectionId) partition key olarak kullanılır. Bu sayede her bağlantı benzersiz olur ve sorgular hızlı çalışır.
Tek bir Lambda fonksiyonu tüm WebSocket rotalarını işleyebilir mi?
Evet, event içindeki 'requestContext.routeKey' alanına göre $connect, $disconnect ve $default rotalarını ayırt edebilirsiniz. Bu, yönetimi kolaylaştırır ancak ayrı fonksiyonlar daha modüler bir yaklaşımdır.






