AWS Lambda + S3 Signed URLs: Büyük Dosya Yükleme için Pratik Çözüm
Lambda proxy yerine S3 signed URL'leri kullanarak büyük dosya yüklemelerini işlemeye yönelik pratik bir yaklaşım. CDK implementasyonu, güvenlik hususları ve production deneyimlerinden çıkarılan dersler dahil.
Video hosting platformumuz Lambda'nın 15 dakikalık limit'i yüzünden 2GB+ upload'larda timeout yaşıyordu. S3 signed URL'lere geçince 10GB+ dosyaları saniyeler içinde işliyoruz; maliyette %70 tasarruf, %99.9 başarı oranı. Presigned URL Lambda'yı URL üretimiyle sınırlar; upload client'tan doğrudan S3'e gider.
Lambda Maliyet Kabusu
Eski flow'umuz: Her upload için Lambda 15 dakikaya kadar çalışıyor, 2-3GB memory kullanıyordu:
Rakamlar: Upload başına 8-12 dk, 2-3GB memory, 10K upload için 30K$+ aylık maliyet, %15 başarısızlık.
Oyun Değiştiren Mimari
Çözüm: Lambda'yı upload pipeline'ından çıkarmak.
Clientlar: Lambda'dan signed URL ister (<200ms), direkt S3'e upload yapar, tamamlanınca S3 processing Lambda'yı tetikler. Ağır trafik Lambda'dan geçmez.
Production-Tested Implementation
10GB+ Dosyaları Handle Eden CDK Infrastrukturu
İşte 18 aydır production'da çalıştırdığımız gerçek CDK stack:
Signed URL Generator - 200ms Lambda
Bu Lambda 200ms'den kısa sürede çalışır ve güvenli upload URL'leri generate eder:
Dosya İşleme Lambda'sı - Sadece Gerekince Çalışır
S3 event trigger ile upload tamamlandığında tetiklenir. Transcoding, thumbnail oluşturma veya virus taraması gibi işlemler için kullanılır. Lambda sadece dosya yüklendiğinde çalıştığından maliyet optimize edilir.
Frontend Implementation - React/TypeScript
İşte clientların signed URL'leri nasıl kullandığı:
React Upload Bileşeni
FileUploader bileşeni useFileUploadWithProgress hook'unu kullanır; drag-and-drop, progress bar ve hata yönetimi sağlar.
Production'da Öğrenilen Güvenlik Dersleri
1. Dosya Tipi Validation (Hem Client hem Server)
2. Boyut Limitleri ve Timeout Koruması
Signed URL üretimi için kısa timeout yeterli; pre-signed URL body'si yok.
3. Erişim Kontrolü ve Audit Logging
CloudTrail ile GetObject ve PutObject çağrılarını logla. S3 bucket policy ile IP kısıtlaması veya VPC endpoint kullan.
Production Performance Rakamları
18 aydır production'da 100.000+ upload ile:
Maliyet Karşılaştırması (Aylık, 10.000 upload ortalama 2GB her biri):
Performance İyileştirmeleri:
- Upload başarı oranı: 85% → 99.9%
- Ortalama upload süresi: 8-12 dakika → 2-5 dakika (network bağımlı)
- Lambda cold start'lar: Upload path'inden tamamen elimine edildi
- Concurrent upload'lar: Lambda concurrency ile sınırlı → Sınırsız S3 kapasitesi
- Kullanıcı deneyimi: Güvenilmez → Progress tracking ile sorunsuz
Gelişmiş Production Pattern'leri
1. 100MB+ Dosyalar için Multipart Upload
S3 multipart API: initiate, upload parts, complete.
2. State Takibi ile Devam Ettirilebilir Upload'lar
Upload kesilirse kaldığı yerden devam. Etag ve part numaralarını sakla.
3. Virus Tarama Entegrasyonu
ClamAV veya S3 Object Lambda ile upload sonrası tarama. Pozitif durumda dosyayı karantinaya al.
Monitoring ve Alerting
CloudWatch Dashboard'ları
Upload sayısı, hata oranı, signed URL latency. Alarm'lar başarısız upload ve yüksek latency için.
Form Verileri ve Dosya Metadata'sı
Dosya Upload'larıyla Birlikte Ek Form Alanları İşleme
İki Aşamalı Upload Pattern'i
Önce metadata ve signed URL al, sonra dosyayı yükle. Production'da form verilerini signed URL upload'larla nasıl ilişkilendireceğiniz:
Data Retention ve Lifecycle Management
S3 Lifecycle Rules ile Otomatik Data Lifecycle
Kullanıcı Kontrollü Data Retention
GDPR Uyumluluk ve Data Portability
Maliyet Optimizasyon Stratejileri
Akıllı Storage Class Seçimi
Kullanım Bazlı Faturalandırma Entegrasyonu
Cost allocation tag'leri ile S3 maliyetlerini tenant'a göre raporla; Lambda ile metrik toplama.
Sonuç: Her Şeyi Değiştiren Mimari
Lambda-proxied upload'lardan S3 signed URL'lere geçmek platformumuzu dönüştürdü:
Teknik Kazanımlar:
- Compute harcamalarında 99% maliyet azaltımı
- Timeout sorunlarını tamamen elimine etti
- S3'ün native kapasitesi ile sınırsız concurrent upload
- Gerçek progress tracking ile daha iyi kullanıcı deneyimi
İş Etkisi:
- Kullanıcı memnuniyet skorları 40% arttı
- Upload sorunları için destek biletleri 85% azaldı
- Platform artık multi-GB dosyalara sahip enterprise clientları handle edebiliyor
- Geliştirme ekibi upload debug'ı yerine özellik geliştirmeye odaklanabiliyor
Anahtar Öğrenimler:
- Process etmeyeceğin şeyi proxy yapma - Lambda güçlü, ama basit dosya depolama için S3 direct upload daha verimli
- Güvenlik çok katmanlı - Signed URL'ler, dosya validation, virüs tarama ve audit trail'ler
- Progressive enhancement işe yarar - Basit signed URL'lerle başla, büyük dosyalar için multipart/resumable upload ekle
- Her şeyi monitörle - Dosya upload'ları birçok şekilde başarısız olabilir, kapsamlı monitoring şart
Bu mimari şimdi aylık 500K+ dosyayı neredeyse mükemmel güvenilirlikle işliyor. Pattern her dosya tipi için çalışır - video'lar, resimler, dokümanlar, veri export'ları. Anahtar, Lambda'nın ne zaman değer kattığını (processing, transformation) ne zaman sadece pahalı bir proxy olduğunu (raw file upload) ayırt etmek.