API Gateway Kullanarak S3'e Dosya Yükleme: Adım Adım Rehber
AWS üzerinde dosya yükleme işlemleri için genellikle API Gateway ve Lambda ikilisi kullanılır. Ancak, sadece dosya yükleme gibi basit bir işlem için Lambda kullanmak, maliyet ve performans açısından her zaman en iyi seçenek olmayabilir. Bu rehberde, Lambda kullanmadan, doğrudan API Gateway üzerinden Amazon S3'e dosya yükleme işlemini nasıl gerçekleştireceğinizi adım adım inceleyeceğiz.
Neden Lambda Yerine Doğrudan Entegrasyon?
Geleneksel yöntemde (API Gateway -> Lambda -> S3), Lambda fonksiyonu bir aracı (proxy) görevi görür. Bu yaklaşım esneklik sağlasa da, büyük dosyalar için Lambda'nın çalışma süresi maliyetlerini artırabilir ve "cold start" (soğuk başlangıç) sorunlarına yol açabilir. Ayrıca, API Gateway'in 10MB ve Lambda'nın 6MB payload limitleri, büyük dosya yüklemelerini zorlaştırabilir.
Doğrudan entegrasyon (API Gateway -> S3) ise şu avantajları sunar:
- Daha Düşük Maliyet: Lambda çalışma süresi ücreti ödemezsiniz.
- Daha Düşük Gecikme (Latency): Aradaki bir katman kalktığı için işlem daha hızlıdır.
- Basitleştirilmiş Mimari: Yönetilecek daha az bileşen vardır.
Adım 1: IAM Rolü ve İzinleri Ayarlama
İlk olarak, API Gateway'in S3 bucket'ınıza dosya yazabilmesi için gerekli izinlere sahip bir IAM rolü oluşturmalıyız.
- AWS Konsolu üzerinden IAM servisine gidin.
- Roles (Roller) sekmesinden Create role (Rol oluştur) butonuna tıklayın.
- "Trusted entity type" olarak AWS Service'i ve hizmet olarak API Gateway'i seçin.
- İleri diyerek bir sonraki adıma geçin ve Create Policy (Politika oluştur) diyerek aşağıdaki JSON politikasını ekleyin (Bucket adınızı güncellemeyi unutmayın):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::sizin-bucket-adiniz/*"
}
]
}
- Oluşturduğunuz bu politikayı role ekleyin ve rolü kaydedin. Rolün ARN (Amazon Resource Name) değerini bir yere not edin.
Adım 2: API Gateway REST API Oluşturma
- AWS Konsolu'nda API Gateway servisine gidin.
- Create API butonuna tıklayın ve REST API seçeneğini seçin (Build).
- API'nize bir isim verin (örneğin:
S3UploadAPI) ve Create API diyerek oluşturun.
Adım 3: Kaynak (Resource) ve Metot (Method) Tanımlama
Dosya yükleme yolunu belirlemek için kaynakları oluşturacağız. Hedeflediğimiz yapı: /{bucket}/{filename}.
- Actions menüsünden Create Resource diyerek
/bucketadında bir kaynak oluşturun. - Bu kaynağın altına
/filenameadında bir alt kaynak daha ekleyin. /filenamekaynağı seçiliyken Actions -> Create Method diyerek PUT metodunu seçin.
Adım 4: Entegrasyon Ayarları
PUT metodunu yapılandırırken şu ayarları kullanın:
- Integration type: AWS Service
- AWS Region: S3 bucket'ınızın bulunduğu bölge (örneğin:
us-east-1). - AWS Service: S3
- HTTP method: PUT
- Action Type: Path override
- Path override:
{bucket}/{key}(Burada{bucket}ve{key}değerlerini URL parametrelerinden alacağız). - Execution role: Adım 1'de oluşturduğunuz IAM rolünün ARN değeri.
Kaydettikten sonra, Integration Request bölümüne gidin ve URL Path Parameters kısmını düzenleyin:
- Name:
bucket-> Mapped from:method.request.path.bucket - Name:
key-> Mapped from:method.request.path.filename
Adım 5: Binary Media Types Ayarı
Görsel veya PDF gibi binary dosyaları yükleyebilmek için API Gateway'e bu veri tiplerini nasıl işleyeceğini söylememiz gerekir.
- API'nin sol menüsünden Settings'e gidin.
- Binary Media Types bölümüne
*/*(tüm dosya tipleri için) veya spesifik olarakimage/jpeg,image/pngekleyin. - Değişiklikleri kaydedin.
Adım 6: API'yi Dağıtma (Deploy) ve Test Etme
- Actions -> Deploy API seçeneğine tıklayın.
- Yeni bir "Stage" oluşturun (örneğin:
dev). - Size verilen Invoke URL'i kopyalayın.
Test etmek için Postman veya curl kullanabilirsiniz:
curl -X PUT -H "Content-Type: image/jpeg" \
--data-binary "@test-resim.jpg" \
https://sizin-api-id.execute-api.us-east-1.amazonaws.com/dev/sizin-bucket-adiniz/yuklenen-resim.jpg
Eğer her şey doğru yapılandırıldıysa, S3 bucket'ınızda yüklediğiniz dosyayı göreceksiniz.
Sonuç
Bu yöntemle, AWS altyapınızda daha az bileşenle, daha hızlı ve düşük maliyetli bir dosya yükleme mekanizması kurmuş oldunuz. Bu yapı özellikle Kubernetes veya diğer container ortamlarından bağımsız, saf sunucusuz mimariler için idealdir.