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ı |
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)
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
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 |
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
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
- En Az Yetki İlkesi: Lambda fonksiyonlarına yalnızca gerekli izinleri verin.
- Gizli Bilgileri Şifreleme:
AWS Systems Manager Parameter StoreveyaSecrets Managerkullanın. - VPC Entegrasyonu: Hassas veriler için özel alt ağlar kullanın.
- API Gateway Yetkilendirmesi: Cognito veya Lambda Authorizer ile kimlik doğrulama sağlayı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ı
- EventBridge ile Olay Odaklı Mimari: Lambda fonksiyonlarınızı EventBridge ile tetikleyerek, gevşek bağlı sistemler oluşturun.
- Step Functions ile İş Akışları: Karmaşık iş akışlarını durum makineleri ile yönetin.
- AppSync ile GraphQL API'ler: DynamoDB verilerinizi GraphQL arayüzüyle sunun.
- Lambda Destinasyonları: Başarılı/başarısız işlemleri SQS, SNS veya başka Lambda'lara yönlendirin.
- 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.
Ek Kaynaklar
- AWS SAM Resmi Dokümantasyonu
- AWS Lambda Power Tuning Aracı
- DynamoDB Tasarım Kalıpları
- Sunucusuz Güvenlik En İyi Pratikleri
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.
Yorumlar
Bir Yorum Bırakın
Henüz yorum yapılmamış. İlk yorumu siz yapın!