Teknoloji AI Üretimi

Kapsamlı AWS Sunucusuz (Serverless) Mimari: Lambda, API Gateway ve DynamoDB Entegrasyonu (SAM Şablon Kodları ve Serverless Akış SVG Diyagramı)

Giriş: Sunucusuz Mimarinin Temelleri ve AWS Ekosistemi

Sunucusuz (serverless) mimariler, altyapı yönetimini ortadan kaldırarak geliştiricilerin iş mantığına odaklanmasını sağlar. AWS, bu alanda Lambda (işlevler), API Gateway (HTTP arayüzü) ve DynamoDB (NoSQL veritabanı) gibi hizmetlerle eksiksiz bir ekosistem sunar. Bu makalede, bu üç bileşenin AWS SAM (Serverless Application Model) ile nasıl entegre edileceğini, gerçek dünya uygulamalarından örneklerle inceleyeceğiz.

Sunucusuzun Avantajları ve Sınırlamaları

Avantajlar Sınırlamalar
Otomatik ölçeklenebilirlik Soğuk başlatma gecikmeleri
Kullandıkça öde modeli Maksimum çalışma süresi (15 dakika)
Altyapı yönetimi yok Dağıtık sistem karmaşıklığı
Yüksek erişilebilirlik Gözlemlenebilirlik zorlukları
🚨 Kritik UyarıSunucusuz mimariler, **monolitik uygulamalar** için uygun değildir. Mikroservisler veya olay odaklı iş yükleri için idealdir. Yanlış kullanım, **maliyet patlamalarına** ve **performans darboğazlarına** yol açabilir.

1. AWS Lambda: İşlevlerin Gücü ve Optimizasyon Stratejileri

AWS Lambda, olay tetikleyicileriyle çalışan sunucusuz işlevler sunar. Her Lambda fonksiyonu, bağımsız bir çalışma zamanı (Node.js, Python, Go, vb.) ve bellek ayarı ile yapılandırılır.

Lambda Fonksiyonlarının Temel Yapısı

# template.yaml (AWS SAM)
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      MemorySize: 512
      Timeout: 10
      Environment:
        Variables:
          TABLE_NAME: !Ref MyDynamoDBTable

Performans Optimizasyonu: Soğuk Başlatma ve Bellek Yönetimi

Lambda fonksiyonlarının performansı, bellek ayarı ve çalışma süresi ile doğrudan ilişkilidir. Örneğin:

  • 512 MB bellek: 100ms çalışma süresi → ~$0.000000834 maliyet
  • 1024 MB bellek: 50ms çalışma süresi → ~$0.000000834 maliyet (aynı maliyet, daha hızlı yanıt)
ℹ️ Best PracticeLambda fonksiyonlarınızı **en az 512 MB bellek** ile başlatın. **AWS Lambda Power Tuning** aracını kullanarak optimum bellek ayarını belirleyin.

Gerçek Dünya Örneği: Kullanıcı Kimlik Doğrulama Fonksiyonu

// auth-service/src/handlers/authenticate.ts
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
import { DynamoDBClient, GetItemCommand } from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({ region: process.env.AWS_REGION });

export const lambdaHandler = async (
  event: APIGatewayProxyEvent
): Promise => {
  try {
    const { username, password } = JSON.parse(event.body || '{}');
    const params = {
      TableName: process.env.USERS_TABLE!,
      Key: { username: { S: username } }
    };
    const { Item } = await client.send(new GetItemCommand(params));
    if (!Item || Item.password.S !== password) {
      return { statusCode: 401, body: JSON.stringify({ error: 'Unauthorized' }) };
    }
    return { statusCode: 200, body: JSON.stringify({ token: 'generated-jwt-token' }) };
  } catch (error) {
    return { statusCode: 500, body: JSON.stringify({ error: 'Internal Server Error' }) };
  }
};

2. API Gateway: RESTful ve WebSocket Arayüzleri

API Gateway, Lambda fonksiyonlarını HTTP uç noktaları olarak sunar. REST API ve WebSocket destekleriyle, tamamen yönetilen bir arayüz sağlar.

REST API Yapılandırması (AWS SAM)

Resources:
  ApiGateway:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      TracingEnabled: true
      MethodSettings:
        - HttpMethod: "*"
          ResourcePath: "/*"
          MetricsEnabled: true
          DataTraceEnabled: true
  HelloWorldApi:
    Type: AWS::Serverless::Function
    Properties:
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /hello
            Method: GET
            RestApiId: !Ref ApiGateway

WebSocket API ile Gerçek Zamanlı Uygulamalar

Resources:
  WebSocketApi:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: RealTimeChatApi
      ProtocolType: WEBSOCKET
      RouteSelectionExpression: "$request.body.action"
  ConnectRoute:
    Type: AWS::ApiGatewayV2::Route
    Properties:
      ApiId: !Ref WebSocketApi
      RouteKey: "$connect"
      Target: !Join
        - '/'
        - - 'integrations'
          - !Ref ConnectIntegration
💡 Mimari KararAPI Gateway **cache** özelliğini etkinleştirerek, sık erişilen uç noktalar için **%70'e varan performans artışı** sağlayabilirsiniz. Ancak, dinamik veriler için cache süresini dikkatli belirleyin.

3. DynamoDB: NoSQL Veritabanı Tasarımı ve Optimizasyonu

DynamoDB, tek haneli milisaniye gecikmeleri sunan, tamamen yönetilen bir NoSQL veritabanıdır. Partition Key ve Sort Key tasarımı, performansı doğrudan etkiler.

Temel Tablo Yapısı (AWS SAM)

Resources:
  UsersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Users
      AttributeDefinitions:
        - AttributeName: "username"
          AttributeType: "S"
        - AttributeName: "createdAt"
          AttributeType: "N"
      KeySchema:
        - AttributeName: "username"
          KeyType: "HASH"
        - AttributeName: "createdAt"
          KeyType: "RANGE"
      BillingMode: PAY_PER_REQUEST
      TimeToLiveSpecification:
        AttributeName: "expiryTime"
        Enabled: true

Gelişmiş Sorgular: Global Secondary Index (GSI) ve PartiQL

// user-service/src/handlers/queryUsers.ts
import { DynamoDBClient, QueryCommand } from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({ region: process.env.AWS_REGION });

export const lambdaHandler = async () => {
  const params = {
    TableName: process.env.USERS_TABLE!,
    IndexName: 'EmailIndex', // GSI adı
    KeyConditionExpression: 'email = :email',
    ExpressionAttributeValues: {
      ':email': { S: 'user@example.com' }
    }
  };
  const { Items } = await client.send(new QueryCommand(params));
  return Items;
};

Performans Optimizasyonu: Adaptive Capacity ve DAX

Teknik Açıklama
Adaptive Capacity Sıcak partition'lar için otomatik kapasite artırımı
DAX (DynamoDB Accelerator) Mikrosaniye gecikmeli okuma işlemleri için cache katmanı
Batch Operations BatchGetItem ve BatchWriteItem ile toplu işlemler
Projection Expressions Yalnızca gerekli alanları döndürerek veri transferini azaltma
🚨 Kritik UyarıDynamoDB'de **hot partition** sorununu önlemek için **partition key** tasarımına dikkat edin. Örneğin, `userId` yerine `userId#date` gibi bileşik anahtarlar kullanın.

4. AWS SAM ile Sunucusuz Uygulama Dağıtımı

AWS SAM, CloudFormation tabanlı bir şablon diliyle sunucusuz uygulamaların tek komutla dağıtılmasını sağlar.

SAM Şablonu: Tam Entegrasyon Örneği

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sunucusuz Kullanıcı Yönetim Sistemi

Globals:
  Function:
    Timeout: 10
    MemorySize: 512
    Runtime: nodejs18.x
    Environment:
      Variables:
        USERS_TABLE: !Ref UsersTable

Resources:
  UsersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Users
      AttributeDefinitions:
        - AttributeName: "userId"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "userId"
          KeyType: "HASH"
      BillingMode: PAY_PER_REQUEST

  CreateUserFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/handlers/createUser/
      Handler: app.lambdaHandler
      Events:
        CreateUserApi:
          Type: Api
          Properties:
            Path: /users
            Method: POST

  GetUserFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/handlers/getUser/
      Handler: app.lambdaHandler
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref UsersTable
      Events:
        GetUserApi:
          Type: Api
          Properties:
            Path: /users/{userId}
            Method: GET

Outputs:
  ApiUrl:
    Description: "API Gateway uç noktası URL'si"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"

Dağıtım ve CI/CD Entegrasyonu

# Uygulamayı yerel olarak test etme
sam local start-api

# Dağıtım paketi oluşturma
sam build

# AWS'ye dağıtma
sam deploy --guided

# CI/CD için örnek GitHub Actions
name: Deploy SAM Application
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
      - uses: aws-actions/setup-sam@v2
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
ℹ️ Best PracticeSAM şablonlarınızda **`Globals`** bölümünü kullanarak, tüm Lambda fonksiyonları için ortak ayarları tek bir yerden yönetin. Bu, **bakım kolaylığı** sağlar ve **hata riskini azaltır**.

5. Gözlemlenebilirlik ve Güvenlik Stratejileri

CloudWatch ve X-Ray ile İzleme

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Tracing: Active
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: user-service
          POWERTOOLS_METRICS_NAMESPACE: MyApp

Güvenlik: IAM Rolleri ve KMS Entegrasyonu

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref UsersTable
        - KMSDecryptPolicy:
            KeyId: !Ref MyKMSKey
      Environment:
        Variables:
          ENCRYPTION_KEY_ARN: !GetAtt MyKMSKey.Arn

Güvenlik En İyi Pratikleri

  1. En Az Yetki İlkesi: Lambda fonksiyonlarına yalnızca gerekli izinleri verin.
  2. Gizli Bilgileri Şifreleme: AWS Systems Manager Parameter Store veya Secrets Manager kullanın.
  3. VPC Entegrasyonu: Hassas veriler için özel alt ağlar kullanın.
  4. API Gateway Yetkilendirmesi: Cognito veya Lambda Authorizer ile kimlik doğrulama sağlayın.
💡 Mimari KararSunucusuz uygulamalarda **gözlemlenebilirlik**, geleneksel uygulamalara göre daha kritiktir. **AWS X-Ray** ve **CloudWatch Alarms** ile **proaktif izleme** sağlayın. Örneğin, Lambda hatalarını **SNS bildirimleri** ile anında alın.

Sonuç: Sunucusuz Mimarinin Geleceği ve İleri Seviye İpuçları

AWS sunucusuz mimarileri, ölçeklenebilirlik, maliyet verimliliği ve hızlı dağıtım avantajlarıyla modern uygulamaların temelini oluşturuyor. Bu makalede ele aldığımız Lambda, API Gateway ve DynamoDB entegrasyonu, gerçek dünya uygulamaları için güçlü bir temel sunar.

İleri Seviye İpuçları

  1. EventBridge ile Olay Odaklı Mimari: Lambda fonksiyonlarınızı EventBridge ile tetikleyerek, gevşek bağlı sistemler oluşturun.
  2. Step Functions ile İş Akışları: Karmaşık iş akışlarını durum makineleri ile yönetin.
  3. AppSync ile GraphQL API'ler: DynamoDB verilerinizi GraphQL arayüzüyle sunun.
  4. Lambda Destinasyonları: Başarılı/başarısız işlemleri SQS, SNS veya başka Lambda'lara yönlendirin.
  5. Canary Dağıtımları: Yeni Lambda sürümlerini %10 trafikle test edin.

Sunucusuzun Geleceği

  • Daha Hızlı Soğuk Başlatmalar: AWS, SnapStart (Java) ve Provisioned Concurrency ile soğuk başlatma sorununu çözüyor.
  • Daha Uzun Çalışma Süreleri: Lambda'nın 15 dakika sınırı, bazı kullanım durumları için yetersiz kalıyor. AWS, bu sınırı 60 dakikaya çıkarmayı planlıyor.
  • Daha İyi Gözlemlenebilirlik: CloudWatch Logs Insights ve X-Ray ile daha derin analizler mümkün hale geliyor.
ℹ️ Best PracticeSunucusuz mimarilerde **maliyet optimizasyonu** kritik öneme sahiptir. **AWS Cost Explorer** ve **Trusted Advisor** ile maliyetleri sürekli izleyin. Gereksiz **Lambda çağrıları** ve **DynamoDB okuma/yazma işlemleri** maliyetleri artırabilir.

Ek Kaynaklar

Bu rehber, AWS sunucusuz mimarilerini başlangıç seviyesinden uzman seviyesine kadar kapsamlı bir şekilde ele almaktadır. Gerçek dünya senaryoları, performans optimizasyonları ve güvenlik stratejileri ile donatılmış bu içerik, üretim ortamında çalışabilir sunucusuz sistemler kurmanız için size rehberlik edecektir.

Etiketler

Bu yazı nasıldı? Bir emoji bırak!

Yorumlar

0 Yorum

Bir Yorum Bırakın

💬

Henüz yorum yapılmamış. İlk yorumu siz yapın!