Kısaca
AWS Lambda API, geliştiricilerin sunucusuz işlevleri programlı olarak dağıtmasına, yönetmesine ve çağırmasına olanak tanır. İşlev yönetimi için IAM kimlik doğrulaması, RESTful uç noktaları, eşzamansız ve zaman uyumlu çağırma seçenekleri ile hesap düzeyinde eşzamanlılık limitleri kullanır. Bu rehber, kimlik doğrulama kurulumunu, işlev dağıtımını, çağırma modellerini, olay kaynağı eşlemesini ve üretim sunucusuz mimari stratejilerini kapsar.
Giriş
AWS Lambda, 1 milyondan fazla aktif kullanıcı için aylık trilyonlarca isteği işler. Sunucusuz uygulamalar, otomasyon araçları veya olay odaklı mimariler geliştiren geliştiriciler için Lambda API entegrasyonu isteğe bağlı değildir; kod olarak altyapı ve CI/CD işlem hatları için hayati öneme sahiptir.
Gerçek şu ki: 50'den fazla Lambda işlevini manuel olarak yöneten ekipler, dağıtımlar, yapılandırma güncellemeleri ve izleme için haftalık 10-15 saat kaybediyor. Sağlam bir Lambda API entegrasyonu, dağıtımları otomatikleştirir, mavi-yeşil yayınları uygular ve talebe dayalı dinamik ölçeklendirme sağlar.
Bu rehber, eksiksiz AWS Lambda API entegrasyon sürecini adım adım anlatmaktadır. IAM kimlik doğrulamasını, işlev oluşturma ve dağıtımını, çağırma modellerini (eşzamanlı/eşzamansız), olay kaynağı eşlemesini, katmanlı mimarileri ve üretim dağıtım stratejilerini öğreneceksiniz. Sonunda, üretime hazır bir Lambda entegrasyonuna sahip olacaksınız.
AWS Lambda API Nedir?
AWS Lambda, sunucusuz bilgi işlem işlevlerini yönetmek için bir RESTful API sağlar. API şunları yönetir:
- İşlev oluşturma, güncelleme ve silme
- Kod dağıtımı ve versiyonlama
- İşlev çağırma (eşzamanlı ve eşzamansız)
- Olay kaynağı eşlemesi (SQS, Kinesis, DynamoDB, S3)
- Paylaşılan kod için katman yönetimi
- Takma ad ve yönlendirme yapılandırması
- Eşzamanlılık ve ayrılmış kapasite yönetimi
- Günlükleme ve izleme entegrasyonu
Temel Özellikler
| Özellik | Açıklama |
|---|---|
| RESTful API | Standart HTTPS uç noktaları |
| IAM Authentication | AWS İmza Sürümü 4 |
| Async Invocation | Ateşle ve unut olay işleme |
| Sync Invocation | İstek-yanıt modeli |
| Event Sources | 200'den fazla AWS hizmet entegrasyonu |
| Layers | Paylaşılan kod ve bağımlılıklar |
| Versions/Aliases | Trafik kaydırma ve geri alma |
| Provisioned Concurrency | Soğuk başlangıçları ortadan kaldırır |
Lambda Çalışma Zamanı Desteği
| Çalışma Zamanı | Sürümler | Kullanım Senaryosu |
|---|---|---|
| Node.js | 18.x, 20.x | API arka uçları, olay işleme |
| Python | 3.9, 3.10, 3.11 | Veri işleme, ML çıkarımı |
| Java | 11, 17, 21 | Kurumsal uygulamalar |
| Go | 1.x | Yüksek performanslı API'ler |
| Rust | 1.x | Düşük gecikmeli işlevler |
| .NET | 6, 8 | Windows iş yükleri |
| Ruby | 3.x | Web uygulamaları |
| Custom | Any | Kapsayıcı tabanlı çalışma zamanları |
API Mimari Genel Bakış
Lambda, AWS hizmet API yapısını kullanır:
https://lambda.{region}.amazonaws.com/2015-03-31/
API Sürümleri
| Sürüm | Durum | Kullanım Senaryosu |
|---|---|---|
| 2015-03-31 | Güncel | Tüm Lambda işlemleri |
| 2018-01-31 | Çalışma Zamanı API'si | Özel çalışma zamanı arayüzü |
Başlarken: Kimlik Doğrulama Kurulumu
Adım 1: AWS Hesabı ve IAM Kullanıcısı Oluşturun
API'ye erişmeden önce:
- AWS Konsolunu ziyaret edin
- AWS hesabı oluşturun
- IAM Konsolu > Kullanıcılar > Kullanıcı Oluştur'a gidin
- Lambda yürütme politikalarını ekleyin
Adım 2: IAM Kimlik Bilgilerini Oluşturun
Programlı erişim için erişim anahtarları oluşturun:
# AWS CLI yöntemi
aws iam create-access-key --user-name lambda-deployer
# Çıktı: Bunları güvenli bir şekilde saklayın
{
"AccessKey": {
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
}
Güvenlik notu: Kimlik bilgilerini güvenli bir şekilde saklayın:
# ~/.aws/credentials
[lambda-deployer]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Veya ortam değişkenlerini kullanın
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="us-east-1"
Adım 3: AWS İmza Sürümü 4'ü Anlayın
Tüm Lambda API istekleri SigV4 imzası gerektirir:
const crypto = require('crypto');
class AWSSigner {
constructor(accessKeyId, secretAccessKey, region, service = 'lambda') {
this.accessKeyId = accessKeyId;
this.secretAccessKey = secretAccessKey;
this.region = region;
this.service = service;
}
sign(request, body = null) {
const now = new Date();
const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, '');
const dateStamp = amzDate.slice(0, 8);
// Task 1: Create canonical request
const hashedPayload = body ? crypto.createHash('sha256').update(body).digest('hex') : 'UNSIGNED-PAYLOAD';
const canonicalUri = request.path;
const canonicalQuerystring = request.query || '';
const canonicalHeaders = `host:${request.host}\nx-amz-date:${amzDate}\n`;
const signedHeaders = 'host;x-amz-date';
const canonicalRequest = `${request.method}\n${canonicalUri}\n${canonicalQuerystring}\n${canonicalHeaders}\n${signedHeaders}\n${hashedPayload}`;
// Task 2: Create string to sign
const algorithm = 'AWS4-HMAC-SHA256';
const credentialScope = `${dateStamp}/${this.region}/${this.service}/aws4_request`;
const hash = crypto.createHash('sha256').update(canonicalRequest).digest('hex');
const stringToSign = `${algorithm}\n${amzDate}\n${credentialScope}\n${hash}`;
// Task 3: Calculate signature
const kDate = this.hmac(`AWS4${this.secretAccessKey}`, dateStamp);
const kRegion = this.hmac(kDate, this.region);
const kService = this.hmac(kRegion, this.service);
const kSigning = this.hmac(kService, 'aws4_request');
const signature = this.hmac(kSigning, stringToSign, 'hex');
// Task 4: Add authorization header
const authorizationHeader = `${algorithm} Credential=${this.accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
return {
'Authorization': authorizationHeader,
'X-Amz-Date': amzDate,
'X-Amz-Content-Sha256': hashedPayload
};
}
hmac(key, string, encoding = 'buffer') {
return crypto.createHmac('sha256', key).update(string).digest(encoding);
}
}
// Kullanım
const signer = new AWSSigner(
process.env.AWS_ACCESS_KEY_ID,
process.env.AWS_SECRET_ACCESS_KEY,
'us-east-1'
);
Adım 4: Lambda API İstemcisi Oluşturun
const LAMBDA_BASE_URL = 'https://lambda.us-east-1.amazonaws.com/2015-03-31';
const lambdaRequest = async (path, options = {}) => {
const url = new URL(`${LAMBDA_BASE_URL}${path}`);
const method = options.method || 'GET';
const body = options.body ? JSON.stringify(options.body) : null;
const signer = new AWSSigner(
process.env.AWS_ACCESS_KEY_ID,
process.env.AWS_SECRET_ACCESS_KEY,
'us-east-1'
);
const headers = signer.sign({ method, host: 'lambda.us-east-1.amazonaws.com', path }, body);
const response = await fetch(url.toString(), {
method,
headers: {
'Content-Type': 'application/json',
...headers,
...options.headers
},
body
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Lambda API Hatası: ${error.Message}`);
}
return response.json();
};
// Kullanım
const functions = await lambdaRequest('/functions');
console.log(`Bulunan işlev sayısı: ${functions.Functions.length}`);
Alternatif: AWS SDK Kullanın
Üretim kullanımı için, AWS SDK imzalamayı otomatik olarak yapar:
const { LambdaClient, ListFunctionsCommand, CreateFunctionCommand, InvokeCommand } = require('@aws-sdk/client-lambda');
const lambda = new LambdaClient({ region: 'us-east-1' });
// İşlevleri listele
const listCommand = new ListFunctionsCommand({});
const result = await lambda.send(listCommand);
// İşlev oluştur
const createCommand = new CreateFunctionCommand({
FunctionName: 'my-function',
Runtime: 'nodejs20.x',
Role: 'arn:aws:iam::123456789012:role/lambda-execution-role',
Handler: 'index.handler',
Code: {
S3Bucket: 'my-bucket',
S3Key: 'function.zip'
}
});
const fn = await lambda.send(createCommand);
İşlev Yönetimi
Bir İşlev Oluşturma
Lambda işlevi API aracılığıyla oluşturun:
const createFunction = async (functionConfig) => {
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionConfig.name,
Runtime: functionConfig.runtime || 'nodejs20.x',
Role: functionConfig.roleArn,
Handler: functionConfig.handler || 'index.handler',
Code: {
S3Bucket: functionConfig.s3Bucket,
S3Key: functionConfig.s3Key
},
Description: functionConfig.description || '',
Timeout: functionConfig.timeout || 3,
MemorySize: functionConfig.memorySize || 128,
Environment: {
Variables: functionConfig.environment || {}
},
Tags: functionConfig.tags || {}
}
});
return response;
};
// Kullanım
const fn = await createFunction({
name: 'order-processor',
roleArn: 'arn:aws:iam::123456789012:role/lambda-execution-role',
handler: 'index.handler',
runtime: 'nodejs20.x',
s3Bucket: 'my-deployments-bucket',
s3Key: 'order-processor/v1.0.0.zip',
description: 'SQS kuyruğundan siparişleri işler',
timeout: 30,
memorySize: 512,
environment: {
DB_HOST: 'db.example.com',
LOG_LEVEL: 'info'
}
});
console.log(`İşlev oluşturuldu: ${fn.FunctionArn}`);
Kodu Doğrudan Yükleme
Küçük işlevler için (<50MB sıkıştırılmış):
const fs = require('fs');
const path = require('path');
const createFunctionWithZip = async (functionName, zipPath) => {
const zipBuffer = fs.readFileSync(zipPath);
const base64Code = zipBuffer.toString('base64');
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionName,
Runtime: 'nodejs20.x',
Role: 'arn:aws:iam::123456789012:role/lambda-execution-role',
Handler: 'index.handler',
Code: {
ZipFile: base64Code
}
}
});
return response;
};
// İşlevi paketle
// zip -r function.zip index.js node_modules/
await createFunctionWithZip('my-function', './function.zip');
İşlev Kodunu Güncelleme
Yeni kod sürümünü dağıtın:
const updateFunctionCode = async (functionName, updateConfig) => {
const response = await lambdaRequest(`/functions/${functionName}/code`, {
method: 'PUT',
body: {
S3Bucket: updateConfig.s3Bucket,
S3Key: updateConfig.s3Key,
Publish: updateConfig.publish || false
}
});
return response;
};
// Kullanım
const updated = await updateFunctionCode('order-processor', {
s3Bucket: 'my-deployments-bucket',
s3Key: 'order-processor/v1.1.0.zip',
publish: true // Yeni sürüm oluştur
});
console.log(`Sürüm şuna güncellendi: ${updated.Version}`);
İşlev Yapılandırmasını Güncelleme
Zaman aşımını, belleği, ortamı değiştirin:
const updateFunctionConfig = async (functionName, config) => {
const response = await lambdaRequest(`/functions/${functionName}/configuration`, {
method: 'PUT',
body: {
Runtime: config.runtime,
Handler: config.handler,
Description: config.description,
Timeout: config.timeout,
MemorySize: config.memorySize,
Environment: {
Variables: config.environment
}
}
});
return response;
};
// Kullanım
const updated = await updateFunctionConfig('order-processor', {
timeout: 60,
memorySize: 1024,
environment: {
DB_HOST: 'new-db.example.com',
LOG_LEVEL: 'debug'
}
});
Bir İşlevi Silme
İşlevi kaldırın:
const deleteFunction = async (functionName, qualifier = null) => {
const path = qualifier
? `/functions/${functionName}?Qualifier=${qualifier}`
: `/functions/${functionName}`;
await lambdaRequest(path, { method: 'DELETE' });
console.log(`İşlev ${functionName} silindi`);
};
İşlev Çağırma
Eşzamanlı Çağırma (İstek-Yanıt)
İşlevi çağırın ve yanıtı bekleyin:
const invokeFunction = async (functionName, payload, qualifier = null) => {
const path = qualifier
? `/functions/${functionName}/invocations?Qualifier=${qualifier}`
: `/functions/${functionName}/invocations`;
const response = await lambdaRequest(path, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'RequestResponse', // Eşzamanlı
'X-Amz-Log-Type': 'Tail' // Günlükleri dahil et
},
body: payload
});
// Yanıtı ayrıştır
const result = JSON.parse(Buffer.from(response.Payload).toString());
const logs = Buffer.from(response.LogResult, 'base64').toString();
return { result, logs };
};
// Kullanım
const { result, logs } = await invokeFunction('order-processor', {
orderId: 'ORD-12345',
customerId: 'CUST-67890',
items: [
{ sku: 'PROD-001', quantity: 2 },
{ sku: 'PROD-002', quantity: 1 }
]
});
console.log(`Sonuç: ${JSON.stringify(result)}`);
console.log(`Günlükler:\n${logs}`);
Eşzamansız Çağırma (Ateşle ve Unut)
Beklemeden işlevi çağırın:
const invokeAsync = async (functionName, payload) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'Event', // Eşzamansız
'X-Amz-Log-Type': 'None'
},
body: payload
});
return {
statusCode: response.StatusCode,
executionId: response['X-Amz-Execution-Id']
};
};
// Kullanım - eşzamansız işlemeyi tetikle
const result = await invokeAsync('email-sender', {
to: 'customer@example.com',
template: 'order-confirmation',
data: { orderId: 'ORD-12345' }
});
console.log(`Eşzamansız çağırma kimliği: ${result.executionId}`);
Deneme Çalıştırması Çağırması
Yürütmeden izinleri test edin:
const dryRunInvocation = async (functionName) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'DryRun'
}
});
return response;
};
// Kullanım - IAM izinlerini doğrula
try {
await dryRunInvocation('order-processor');
console.log('Çağırma izinleri TAMAM');
} catch (error) {
console.error('İzin reddedildi:', error.message);
}
Çağırma Yanıt Türleri
| Çağırma Türü | Davranış | Kullanım Senaryosu |
|---|---|---|
RequestResponse |
Eşzamanlı, sonuç bekle | API çağrıları, CLI komutları |
Event |
Eşzamansız, ateşle ve unut | Olay işleme, bildirimler |
DryRun |
Yalnızca izinleri test et | Doğrulama, hata ayıklama |
Sürüm ve Takma Ad Yönetimi
Sürümleri Yayınlama
Değişmez işlev sürümü oluşturun:
const publishVersion = async (functionName, description = null) => {
const response = await lambdaRequest(`/functions/${functionName}/versions`, {
method: 'POST',
body: description ? { Description: description } : {}
});
return response;
};
// Kullanım
const version = await publishVersion('order-processor', 'v1.2.0 - Vergi hesaplaması ekle');
console.log(`Yayınlanan sürüm: ${version.Version}`);
Takma Adlar Oluşturma
Sürüme adlandırılmış işaretçi oluşturun:
const createAlias = async (functionName, aliasName, version, description = null) => {
const response = await lambdaRequest(`/functions/${functionName}/aliases`, {
method: 'POST',
body: {
Name: aliasName,
FunctionVersion: version,
Description: description
}
});
return response;
};
// Kullanım - Üretim takma adı oluştur
const prodAlias = await createAlias('order-processor', 'prod', '5', 'Üretim sürümü');
console.log(`Takma Ad ARN: ${prodAlias.AliasArn}`);
Yönlendirme Yapılandırması ile Trafik Kaydırma
Trafiği kademeli olarak yeni sürüme kaydırın:
const updateAliasWithRouting = async (functionName, aliasName, routingConfig) => {
const response = await lambdaRequest(`/functions/${functionName}/aliases/${aliasName}`, {
method: 'PUT',
body: {
RoutingConfig: {
AdditionalVersionWeights: routingConfig
}
}
});
return response;
};
// Kullanım - %10 trafik sürüm 6'ya, %90 sürüm 5'e
await updateAliasWithRouting('order-processor', 'prod', {
'6': 0.1
});
// Doğrulama sonrası, %100'e kaydırın
await updateAliasWithRouting('order-processor', 'prod', {});
Takma Ad Kullanım Senaryoları
| Takma Ad | Sürüm | Amaç |
|---|---|---|
dev |
$LATEST | Geliştirme testi |
staging |
Latest tested | QA doğrulaması |
prod |
Stable version | Üretim trafiği |
blue |
Current prod | Mavi-yeşil dağıtımlar |
green |
New version | Mavi-yeşil dağıtımlar |
Olay Kaynağı Eşlemesi
SQS Tetikleyicisi Oluşturma
SQS kuyruğunu Lambda'ya bağlayın:
const createSQSEventSource = async (functionName, queueArn, batchSize = 10) => {
const response = await lambdaRequest('/event-source-mappings', {
method: 'POST',
body: {
EventSourceArn: queueArn,
FunctionName: functionName,
BatchSize: batchSize,
Enabled: true
}
});
return response;
};
// Kullanım
const mapping = await createSQSEventSource(
'order-processor',
'arn:aws:sqs:us-east-1:123456789012:orders-queue',
10
);
console.log(`Olay kaynağı oluşturuldu: ${mapping.UUID}`);
DynamoDB Akış Tetikleyicisi Oluşturma
DynamoDB akışını Lambda'ya bağlayın:
const createDynamoDBEventSource = async (functionName, streamArn, startingPosition = 'LATEST') => {
const response = await lambdaRequest('/event-source-mappings', {
method: 'POST',
body: {
EventSourceArn: streamArn,
FunctionName: functionName,
StartingPosition: startingPosition,
BatchSize: 100,
BisectBatchOnFunctionError: true,
MaximumRetryAttempts: 3
}
});
return response;
};
// Kullanım
await createDynamoDBEventSource(
'user-analytics',
'arn:aws:dynamodb:us-east-1:123456789012:table/Users/stream/2026-03-25T00:00:00.000'
);
Olay Kaynağı Türleri
| Kaynak | Kullanım Senaryosu | Toplu İşlem Desteği |
|---|---|---|
| SQS | Mesaj kuyrukları | Evet (1-10) |
| Kinesis | Gerçek zamanlı akışlar | Evet (1-10,000) |
| DynamoDB Streams | Veritabanı değişiklikleri | Evet (1-1,000) |
| S3 | Nesne olayları | Hayır (olay başına 1) |
| EventBridge | Olay yönlendirme | Evet |
| API Gateway | HTTP API'leri | Hayır |
| Schedule | Zamanlanmış işler (Cron işleri) | Hayır |
Katman Yönetimi
Bir Katman Oluşturma
Paylaşılan kodu/bağımlılıkları paketleyin:
const createLayer = async (layerName, layerConfig) => {
const response = await lambdaRequest('/layers', {
method: 'POST',
body: {
LayerName: layerName,
Description: layerConfig.description,
CompatibleRuntimes: layerConfig.runtimes,
Content: {
S3Bucket: layerConfig.s3Bucket,
S3Key: layerConfig.s3Key
}
}
});
return response;
};
// Kullanım
const layer = await createLayer('shared-utils', {
description: 'Paylaşılan yardımcı programlar ve bağımlılıklar',
runtimes: ['nodejs20.x', 'nodejs18.x'],
s3Bucket: 'my-layers-bucket',
s3Key: 'shared-utils/v1.zip'
});
console.log(`Katman ARN: ${layer.LayerArn}`);
İşlevlerde Katmanları Kullanma
Katmanları işlevlere ekleyin:
const createFunctionWithLayers = async (functionConfig) => {
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionConfig.name,
Runtime: functionConfig.runtime,
Role: functionConfig.roleArn,
Handler: functionConfig.handler,
Code: {
S3Bucket: functionConfig.s3Bucket,
S3Key: functionConfig.s3Key
},
Layers: functionConfig.layers // Katman ARN'lerinin dizisi
}
});
return response;
};
// Kullanım
await createFunctionWithLayers({
name: 'api-handler',
roleArn: 'arn:aws:iam::123456789012:role/lambda-execution-role',
handler: 'index.handler',
runtime: 'nodejs20.x',
s3Bucket: 'my-deployments-bucket',
s3Key: 'api-handler/v1.0.0.zip',
layers: [
'arn:aws:lambda:us-east-1:123456789012:layer:shared-utils:1',
'arn:aws:lambda:us-east-1:123456789012:layer:aws-sdk:3'
]
});
Eşzamanlılık ve Ölçeklendirme
Ayrılmış Eşzamanlılığı Ayarlama
Kritik işlevler için kapasite ayırın:
const putFunctionConcurrency = async (functionName, reservedConcurrentExecutions) => {
const response = await lambdaRequest(`/functions/${functionName}/concurrency`, {
method: 'PUT',
body: {
ReservedConcurrentExecutions: reservedConcurrentExecutions
}
});
return response;
};
// Kullanım - 100 eşzamanlı yürütme ayırın
await putFunctionConcurrency('order-processor', 100);
Hesap Eşzamanlılık Limitleri
| Hesap Türü | Varsayılan Limit | Artırım Mevcut |
|---|---|---|
| Free Tier | 1,000 | Evet |
| Pay-as-you-go | 1,000 | Evet |
| Enterprise | 1,000+ | Özel limitler |
Üretim Dağıtım Kontrol Listesi
Üretime dağıtmadan önce:
- [ ] Otomatik SigV4 imzalaması için AWS SDK kullanın
- [ ] Takma adlarla versiyonlama uygulayın
- [ ] Kritik işlevler için ayrılmış eşzamanlılığı yapılandırın
- [ ] Eşzamansız çağırmalar için ölü mektup kuyrukları (DLQ) kurun
- [ ] Hata ayıklama için X-Ray izlemeyi etkinleştirin
- [ ] Veritabanı erişimi için VPC yapılandırın
- [ ] Yapılandırılmış günlüklemeyi uygulayın (JSON formatı)
- [ ] CloudWatch alarmlarını kurun
- [ ] Paylaşılan bağımlılıklar için katmanları kullanın
- [ ] Mavi-yeşil dağıtım stratejisi uygulayın
Gerçek Dünya Kullanım Senaryoları
API Arka Uç
Bir SaaS şirketi sunucusuz REST API oluşturur:
- Zorluk: Değişken trafik, öngörülemeyen ölçeklendirme
- Çözüm: Otomatik ölçeklendirmeli Lambda + API Gateway
- Sonuç: %99,99 çalışma süresi, EC2'ye kıyasla %60 maliyet azalması
Temel uygulama:
- Kaynak başına Lambda işlevleri
- Yönlendirme/kimlik doğrulama için API Gateway
- Veri depolama için DynamoDB
- Tutarlı gecikme için ayrılmış eşzamanlılık
Olay İşleme Hattı
Bir e-ticaret platformu siparişleri işler:
- Zorluk: Satış etkinlikleri sırasında sipariş artışları
- Çözüm: Toplu işlemeli SQS + Lambda
- Sonuç: Kayıp sipariş yok, 10 kat artış işleme
Temel uygulama:
- SQS kuyruğu siparişleri tamponlar
- Lambda toplu olarak 10 mesajı işler
- Başarısız mesajlar için DLQ
- Kuyruk derinliği hakkında CloudWatch uyarıları
Sonuç
AWS Lambda API, kapsamlı sunucusuz bilgi işlem yetenekleri sunar. Temel çıkarımlar:
- SigV4 imzalamalı IAM kimlik doğrulaması (AWS SDK kullanın)
- Eşzamanlı ve eşzamansız çağırma modelleri
- Dağıtımlar için sürüm ve takma ad yönetimi
- Sunucusuz mimariler için olay kaynağı eşlemesi
- Paylaşılan kod ve bağımlılıklar için katmanlar
- Apidog, API testini ve ekip işbirliğini kolaylaştırır
SSS Bölümü
Lambda API ile nasıl kimlik doğrularım?
Signature Version 4 imzalamalı AWS IAM kimlik bilgilerini kullanın. AWS SDK, imzalamayı otomatik olarak yapar.
Eşzamanlı ve eşzamansız çağırma arasındaki fark nedir?
Eşzamanlı (RequestResponse), işlevin tamamlanmasını bekler ve sonuçları döndürür. Eşzamansız (Event), isteği sıraya alır ve hemen geri döner.
Lambda sürümleri nasıl çalışır?
Yayınlanan her sürüm, işlevinizin değişmez bir anlık görüntüsüdür. Belirli sürümleri işaret etmek ve trafik kaydırmayı etkinleştirmek için takma adları kullanın.
Lambda Katmanları nelerdir?
Katmanlar, kodu ve bağımlılıkları işlev kodundan ayrı olarak paketleyerek, birden çok işlev arasında paylaşılan kütüphaneleri etkinleştirir.
Soğuk başlangıçları nasıl azaltırım?
Gecikmeye duyarlı işlevler için ayrılmış eşzamanlılığı, daha küçük dağıtım paketlerini ve derlenmiş dilleri (Go, Rust) kullanın.
Ayrılmış eşzamanlılık nedir?
Ayrılmış eşzamanlılık, belirli işlevler için yürütme yuvalarını garanti eder, gürültülü komşu sorunlarını önler.
Lambda'yı S3'ten tetikleyebilir miyim?
Evet, nesne oluşturma/silme işlemlerinde Lambda'yı çağırmak için S3 olay bildirimlerini yapılandırın.
