Bulut Günlüğü (AWS)

AWS Lambda ile Sunucusuz (Serverless) Uygulama Geliştirme: Derinlemesine Bir Bakış

 · 

AWS Lambda ile Sunucusuz (Serverless) Uygulama Geliştirme: Derinlemesine Bir Bakış

AWS Lambda ile Sunucusuz Uygulama Geliştirme: Derinlemesine Bir Bakış

AWS Lambda, sunucu yönetimi zahmetine girmeden kod çalıştırabilmenizi sağlayan bir bilgi işlem hizmetidir. Geliştiricilerin sunucu sağlama, ölçeklendirme veya bakım gibi operasyonel görevlerle uğraşmadan yalnızca kodlarına odaklanmalarını mümkün kılar. Bu, özellikle değişken iş yüklerine sahip veya hızlı bir şekilde pazara yeni özellikler sunmak isteyen uygulamalar için devrim niteliğinde bir yaklaşımdır.

Lambda Temelleri ve Mimari

AWS Lambda, olay güdümlü bir model üzerine kuruludur. Bir işlev (function) olarak adlandırılan kod parçacıkları, belirli olaylar tetiklendiğinde otomatik olarak çalışır. Bu olaylar, Amazon S3'e yüklenen bir dosya, Amazon API Gateway üzerinden gelen bir HTTP isteği, bir veritabanındaki değişiklik veya zamanlanmış bir olay gibi çeşitli kaynaklardan gelebilir. Lambda, bu olayları algılar, ilgili işlevi tetikler ve kodu ölçeklenebilir bir şekilde çalıştırır.

Lambda işlevleri, çeşitli programlama dillerinde (Node.js, Python, Java, C#, Go, Ruby ve özel çalışma zamanları) yazılabilir. Her işlev, kendi bağımsız ortamında izole bir şekilde çalışır. Lambda, gelen isteklere göre işlevleri otomatik olarak ölçeklendirir; talep arttığında daha fazla örneği (instance) paralel olarak çalıştırır ve talep azaldığında örnekleri durdurur. Bu, yalnızca kullandığınız işlem süresi için ödeme yapmanızı sağlar, bu da maliyetleri önemli ölçüde düşürebilir.

Gelişmiş Kullanım Senaryoları ve Teknik Derinlik

Lambda'nın gücü, basit tekil görevlerin ötesine geçer. Gerçek dünya üretim (production) senaryolarında, karmaşık iş akışlarını yönetmek, veri işlemeyi otomatikleştirmek ve mikroservis mimarilerini desteklemek için yaygın olarak kullanılır.

1. Gerçek Zamanlı Dosya İşleme ve Resim Yeniden Boyutlandırma

Bir e-ticaret platformunda, kullanıcılar ürün görsellerini yüklediğinde, bu görsellerin farklı boyutlarda (küçük resim, orta boy, büyük boy) yeniden oluşturulması gerekir. Bu süreç, bir S3 bucket'ına yeni bir dosya yüklendiğinde tetiklenen bir Lambda işlevi ile otomatikleştirilebilir.

Teknik Detaylar:

  • Olay Kaynağı: S3 Bucket Event Notification (ObjectCreatedPUT).
  • Lambda İşlevi: Python ile yazılmış, `boto3` SDK'sını kullanarak S3'ten orijinal görüntüyü indirir, `Pillow` (PIL) kütüphanesi ile yeniden boyutlandırır ve farklı boyutlardaki sürümleri aynı veya farklı bir S3 bucket'ına yükler.
  • Kod Örneği (Basitleştirilmiş Python):

import boto3
from PIL import Image
import io

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    size_format = event['Records'][0]['s3']['object'].get('size', None) # Örnek: 'thumbnail', 'medium', 'large'

    if not key.endswith(('.png', '.jpg', '.jpeg')):
        print(f"Skipping non-image file: {key}")
        return

    try:
        # Görüntüyü S3'ten indir
        response = s3.get_object(Bucket=bucket, Key=key)
        image_data = response['Body'].read()
        image = Image.open(io.BytesIO(image_data))

        # Farklı boyutlar için yeniden boyutlandır (Örnek: Thumbnail)
        thumb_width = 128
        thumb_height = 128
        image.thumbnail((thumb_width, thumb_height))

        # Yeniden boyutlandırılmış görüntüyü hafızada sakla
        buffer = io.BytesIO()
        image.save(buffer, format='JPEG')
        buffer.seek(0)

        # Yeniden boyutlandırılmış görüntüyü S3'e yükle
        new_key = f"processed/{size_format}/{key.split('/')[-1]}"
        s3.upload_fileobj(buffer, bucket, new_key)

        print(f"Successfully resized {key} to {new_key}")

        return {
            'statusCode': 200,
            'body': 'Image resized successfully!'
        }

    except Exception as e:
        print(f"Error processing image {key}: {e}")
        return {
            'statusCode': 500,
            'body': f'Error processing image: {str(e)}'
        }

Bu senaryoda, Lambda işlevi, S3 olay bildirimleri aracılığıyla tetiklenir. İşlev, görüntüyü indirir, `Pillow` ile yeniden boyutlandırır ve işlenmiş yeni bir sürümü farklı bir S3 klasörüne (veya bucket'a) yükler. Görüntü işleme gibi CPU yoğun görevler için Lambda'nın bellek ve zaman aşımları dikkatlice ayarlanmalıdır.

2. API Gateway ile Sunucusuz REST API Oluşturma

Birçok web ve mobil uygulama, arka uç mantığını çalıştırmak için RESTful API'lere ihtiyaç duyar. AWS API Gateway ve Lambda, sunucusuz bir API oluşturmak için mükemmel bir ikilidir.

Teknik Detaylar:

  • API Gateway: Gelen HTTP isteklerini (GET, POST, PUT, DELETE vb.) alır ve bunları Lambda işlevlerine yönlendirir. İstek ve yanıt dönüşümleri, kimlik doğrulama ve yetkilendirme gibi özellikleri yönetir.
  • Lambda İşlevi: API Gateway'den gelen olayı (event) işler. Olay nesnesi, istek metodu, yol, başlıklar (headers), sorgu parametreleri ve gövde (body) gibi bilgileri içerir. İşlev, bu bilgilere dayanarak iş mantığını yürütür ve uygun bir HTTP yanıtı döndürür.
  • Kod Örneği (Basitleştirilmiş Node.js):

exports.handler = async (event) => {
    let response;
    const method = event.httpMethod;
    const path = event.path;

    if (method === 'GET' && path === '/users') {
        // Kullanıcıları listeleme mantığı
        response = {
            statusCode: 200,
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }])
        };
    } else if (method === 'POST' && path === '/users') {
        // Yeni kullanıcı oluşturma mantığı
        const requestBody = JSON.parse(event.body);
        // ... veritabanına kaydetme ...
        response = {
            statusCode: 201,
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({ message: 'User created successfully', userId: 3 })
        };
    } else {
        // Kaynak bulunamadı
        response = {
            statusCode: 404,
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({ message: 'Not Found' })
        };
    }

    return response;
};

Bu yapı, tam özellikli, ölçeklenebilir bir web API'sini sunucu yönetimi olmadan oluşturmayı sağlar. API Gateway, gelen istekleri alır, Lambda işlevini çağırır ve Lambda'dan gelen yanıtı istemciye geri gönderir. Geliştiriciler sadece API uç noktalarına karşılık gelen kodlara odaklanır.

3. Veritabanı Tetikleyicileri ve Veri Senkronizasyonu

AWS Lambda, DynamoDB gibi NoSQL veritabanlarındaki değişiklikleri izlemek ve bu değişikliklere tepki vermek için de kullanılabilir. Örneğin, bir sipariş veritabanında yeni bir sipariş oluşturulduğunda, ilgili envanter veritabanını güncellemek veya bir bildirim göndermek için bir Lambda işlevi tetiklenebilir.

Teknik Detaylar:

  • Olay Kaynağı: DynamoDB Streams (New and old images).
  • Lambda İşlevi: DynamoDB Streams'ten gelen kayıtları işler. Her kayıt, eklenen, güncellenen veya silinen öğenin eski ve yeni görüntülerini içerir. İşlev, bu değişiklikleri analiz eder ve başka bir veritabanını güncellemek, bir mesaj kuyruğuna göndermek veya başka bir AWS hizmetini tetiklemek için kullanılır.

Bu tür senaryolar, sistemler arasında gevşek bağlılık (loose coupling) sağlayarak daha dayanıklı ve ölçeklenebilir mimariler oluşturmaya olanak tanır. Lambda'nın olay güdümlü doğası, bu tür senkronizasyon görevleri için idealdir çünkü yalnızca değişiklik olduğunda çalışır ve kaynakları israf etmez.

Performans ve Maliyet Optimizasyonu

Lambda ile çalışırken performans ve maliyeti optimize etmek kritik öneme sahiptir. İşlevlerin bellek ayarları, işlemci gücünü doğrudan etkiler; daha fazla bellek, daha fazla CPU anlamına gelir. Bu nedenle, işlevin ihtiyaçlarına göre doğru bellek miktarını seçmek önemlidir.

Hızlandırma (Provisioned Concurrency): Standart Lambda'da, işlevler bir süre kullanılmadığında soğuk başlatma (cold start) yaşayabilirler. Bu, ilk isteğin daha uzun sürmesine neden olabilir. Hassas zamanlama gerektiren uygulamalar için Provisioned Concurrency, işlev örneklerinin önceden başlatılmasını sağlayarak bu gecikmeyi ortadan kaldırır, ancak ek maliyet getirir.

Kod Optimizasyonu: İşlevlerin başlangıç süresini (init time) azaltmak için bağımlılıkları (dependencies) optimize etmek, gereksiz kütüphaneleri kaldırmak ve kodun verimli olduğundan emin olmak gerekir. Yalnızca gerekli kütüphaneleri dahil etmek ve kodun modüler olması, hem başlatma süresini hem de bellek kullanımını iyileştirir.

Sonuç

AWS Lambda, sunucusuz mimarilerin temel taşıdır. Geliştiricilerin altyapı yönetimi yerine iş mantığına odaklanmasını sağlayarak inovasyonu hızlandırır. Yukarıda belirtilen senaryolar, Lambda'nın esnekliğini ve gücünü göstermektedir; gerçek zamanlı veri işleme, API oluşturma ve veritabanı entegrasyonları gibi çeşitli görevlerde etkili bir şekilde kullanılabilir. Doğru yapılandırma ve optimizasyon teknikleriyle, Lambda maliyet etkin ve yüksek performanslı uygulamalar geliştirmek için güçlü bir araçtır.

← Blog Listesine Dön