TL;DR
تُمكن واجهة برمجة تطبيقات AWS Lambda المطورين من نشر الدوال عديمة الخادم وإدارتها واستدعائها برمجياً. تستخدم مصادقة IAM، ونقاط نهاية RESTful لإدارة الدوال، وخيارات استدعاء غير متزامنة ومتزامنة، مع حدود التزامن على مستوى الحساب. يغطي هذا الدليل إعداد المصادقة، ونشر الدوال، وأنماط الاستدعاء، وتعيين مصادر الأحداث، واستراتيجيات بنية عديمة الخادم للإنتاج.
مقدمة
تعالج AWS Lambda تريليونات الطلبات شهرياً لأكثر من مليون مستخدم نشط. بالنسبة للمطورين الذين يبنون تطبيقات عديمة الخادم، أو أدوات أتمتة، أو بنى تعتمد على الأحداث، فإن تكامل Lambda API ليس اختيارياً - إنه ضروري للبنية التحتية كرمز وخطوط أنابيب CI/CD.
الواقع هو: أن الفرق التي تدير أكثر من 50 دالة Lambda يدوياً تخسر 10-15 ساعة أسبوعياً في عمليات النشر، وتحديثات التكوين، والمراقبة. تكامل Lambda API القوي يؤتمت عمليات النشر، وينفذ الإصدارات الزرقاء-الخضراء، ويمكّن من التوسع الديناميكي بناءً على الطلب.
يرشدك هذا الدليل خلال عملية تكامل AWS Lambda API الكاملة. ستتعلم مصادقة IAM، وإنشاء الدوال ونشرها، وأنماط الاستدعاء (متزامن/غير متزامن)، وتعيين مصادر الأحداث، والبنى الطبقية، واستراتيجيات النشر للإنتاج. بحلول النهاية، سيكون لديك تكامل Lambda جاهز للإنتاج.
ما هي واجهة برمجة تطبيقات AWS Lambda؟
توفر AWS Lambda واجهة برمجة تطبيقات RESTful لإدارة دوال الحوسبة عديمة الخادم. تتعامل واجهة برمجة التطبيقات مع:
- إنشاء الدوال وتحديثها وحذفها
- نشر الأكواد وإصدارها
- استدعاء الدوال (متزامن وغير متزامن)
- تعيين مصادر الأحداث (SQS, Kinesis, DynamoDB, S3)
- إدارة الطبقات للرموز المشتركة
- تكوين الأسماء المستعارة والتوجيه
- إدارة التزامن والسعة المحجوزة
- تكامل التسجيل والمراقبة
الميزات الرئيسية
| الميزة | الوصف |
|---|---|
| واجهة برمجة تطبيقات RESTful | نقاط نهاية HTTPS قياسية |
| مصادقة IAM | توقيع AWS الإصدار 4 |
| الاستدعاء غير المتزامن | معالجة الأحداث بنمط "أطلق وانسَ" |
| الاستدعاء المتزامن | نمط الطلب-الاستجابة |
| مصادر الأحداث | أكثر من 200 تكامل خدمة AWS |
| الطبقات | رمز مشترك وتوابع |
| الإصدارات/الأسماء المستعارة | تحويل حركة المرور والتراجعات |
| التزامن المجهز | القضاء على أوقات البدء الباردة |
دعم وقت تشغيل Lambda
| وقت التشغيل | الإصدارات | حالة الاستخدام |
|---|---|---|
| Node.js | 18.x, 20.x | خلفيات API، معالجة الأحداث |
| Python | 3.9, 3.10, 3.11 | معالجة البيانات، استنتاج تعلم الآلة |
| Java | 11, 17, 21 | تطبيقات المؤسسات |
| Go | 1.x | واجهات برمجة تطبيقات عالية الأداء |
| Rust | 1.x | دوال ذات زمن استجابة منخفض |
| .NET | 6, 8 | أعباء عمل Windows |
| Ruby | 3.x | تطبيقات الويب |
| مخصص | أي | أوقات تشغيل قائمة على الحاويات |
نظرة عامة على بنية واجهة برمجة التطبيقات
تستخدم Lambda بنية واجهة برمجة تطبيقات خدمة AWS:
https://lambda.{region}.amazonaws.com/2015-03-31/
إصدارات واجهة برمجة التطبيقات
| الإصدار | الحالة | حالة الاستخدام |
|---|---|---|
| 2015-03-31 | الحالي | جميع عمليات Lambda |
| 2018-01-31 | واجهة برمجة تطبيقات وقت التشغيل | واجهة وقت تشغيل مخصصة |
البدء: إعداد المصادقة
الخطوة 1: إنشاء حساب AWS ومستخدم IAM
قبل الوصول إلى واجهة برمجة التطبيقات:
- زر AWS Console
- أنشئ حساب AWS
- انتقل إلى IAM Console > Users > Create User
- أرفق سياسات تنفيذ Lambda
الخطوة 2: إنشاء بيانات اعتماد IAM
أنشئ مفاتيح وصول للوصول البرمجي:
# طريقة AWS CLI
aws iam create-access-key --user-name lambda-deployer
# الإخراج: قم بتخزين هذه بأمان
{
"AccessKey": {
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
}
ملاحظة أمنية: قم بتخزين بيانات الاعتماد بأمان:
# ~/.aws/credentials
[lambda-deployer]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# أو استخدم متغيرات البيئة
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="us-east-1"
الخطوة 3: فهم توقيع AWS الإصدار 4
تتطلب جميع طلبات Lambda API توقيع SigV4:
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);
// المهمة 1: إنشاء طلب قانوني (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}`;
// المهمة 2: إنشاء سلسلة للتوقيع (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}`;
// المهمة 3: حساب التوقيع
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');
// المهمة 4: إضافة رأس المصادقة (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);
}
}
// الاستخدام
const signer = new AWSSigner(
process.env.AWS_ACCESS_KEY_ID,
process.env.AWS_SECRET_ACCESS_KEY,
'us-east-1'
);
الخطوة 4: إنشاء عميل Lambda API
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: ${error.Message}`);
}
return response.json();
};
// الاستخدام
const functions = await lambdaRequest('/functions');
console.log(`تم العثور على ${functions.Functions.length} دالة`);
بديل: استخدام AWS SDK
للاستخدام في الإنتاج، تتعامل AWS SDK مع التوقيع تلقائيًا:
const { LambdaClient, ListFunctionsCommand, CreateFunctionCommand, InvokeCommand } = require('@aws-sdk/client-lambda');
const lambda = new LambdaClient({ region: 'us-east-1' });
// سرد الدوال
const listCommand = new ListFunctionsCommand({});
const result = await lambda.send(listCommand);
// إنشاء دالة
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);
إدارة الدوال
إنشاء دالة
إنشاء دالة Lambda عبر واجهة برمجة التطبيقات:
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;
};
// الاستخدام
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',
timeout: 30,
memorySize: 512,
environment: {
DB_HOST: 'db.example.com',
LOG_LEVEL: 'info'
}
});
console.log(`تم إنشاء الدالة: ${fn.FunctionArn}`);
تحميل الكود مباشرةً
للدوال الصغيرة (أقل من 50 ميغابايت مضغوطة):
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;
};
// حزمة الدالة
// zip -r function.zip index.js node_modules/
await createFunctionWithZip('my-function', './function.zip');
تحديث كود الدالة
نشر إصدار كود جديد:
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;
};
// الاستخدام
const updated = await updateFunctionCode('order-processor', {
s3Bucket: 'my-deployments-bucket',
s3Key: 'order-processor/v1.1.0.zip',
publish: true // إنشاء إصدار جديد
});
console.log(`تم التحديث إلى الإصدار: ${updated.Version}`);
تحديث إعدادات الدالة
تعديل المهلة والذاكرة والبيئة:
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;
};
// الاستخدام
const updated = await updateFunctionConfig('order-processor', {
timeout: 60,
memorySize: 1024,
environment: {
DB_HOST: 'new-db.example.com',
LOG_LEVEL: 'debug'
}
});
حذف دالة
إزالة الدالة:
const deleteFunction = async (functionName, qualifier = null) => {
const path = qualifier
? `/functions/${functionName}?Qualifier=${qualifier}`
: `/functions/${functionName}`;
await lambdaRequest(path, { method: 'DELETE' });
console.log(`تم حذف الدالة ${functionName}`);
};
استدعاء الدوال
الاستدعاء المتزامن (الطلب-الاستجابة)
استدعاء دالة والانتظار للاستجابة:
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', // متزامن
'X-Amz-Log-Type': 'Tail' // تضمين السجلات
},
body: payload
});
// تحليل الاستجابة
const result = JSON.parse(Buffer.from(response.Payload).toString());
const logs = Buffer.from(response.LogResult, 'base64').toString();
return { result, logs };
};
// الاستخدام
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(`النتيجة: ${JSON.stringify(result)}`);
console.log(`السجلات:\n${logs}`);
الاستدعاء غير المتزامن (أطلق وانسَ)
استدعاء دالة دون انتظار:
const invokeAsync = async (functionName, payload) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'Event', // غير متزامن
'X-Amz-Log-Type': 'None'
},
body: payload
});
return {
statusCode: response.StatusCode,
executionId: response['X-Amz-Execution-Id']
};
};
// الاستخدام - تشغيل معالجة غير متزامنة
const result = await invokeAsync('email-sender', {
to: 'customer@example.com',
template: 'order-confirmation',
data: { orderId: 'ORD-12345' }
});
console.log(`معرف الاستدعاء غير المتزامن: ${result.executionId}`);
استدعاء تجريبي
اختبار الأذونات دون التنفيذ:
const dryRunInvocation = async (functionName) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'DryRun'
}
});
return response;
};
// الاستخدام - التحقق من أذونات IAM
try {
await dryRunInvocation('order-processor');
console.log('أذونات الاستدعاء سليمة');
} catch (error) {
console.error('تم رفض الإذن:', error.message);
}
أنواع استجابات الاستدعاء
| نوع الاستدعاء | السلوك | حالة الاستخدام |
|---|---|---|
RequestResponse |
متزامن، ينتظر النتيجة | استدعاءات API، أوامر CLI |
Event |
غير متزامن، أطلق وانسَ | معالجة الأحداث، الإشعارات |
DryRun |
اختبار الأذونات فقط | التحقق، التصحيح |
إدارة الإصدارات والأسماء المستعارة
نشر الإصدارات
إنشاء إصدار دالة غير قابل للتغيير:
const publishVersion = async (functionName, description = null) => {
const response = await lambdaRequest(`/functions/${functionName}/versions`, {
method: 'POST',
body: description ? { Description: description } : {}
});
return response;
};
// الاستخدام
const version = await publishVersion('order-processor', 'v1.2.0 - إضافة حساب الضريبة');
console.log(`الإصدار المنشور: ${version.Version}`);
إنشاء الأسماء المستعارة
إنشاء مؤشر مسمى للإصدار:
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;
};
// الاستخدام - إنشاء اسم مستعار للإنتاج
const prodAlias = await createAlias('order-processor', 'prod', '5', 'إصدار الإنتاج');
console.log(`اسم المورد الخاص بالاسم المستعار (Alias ARN): ${prodAlias.AliasArn}`);
تحويل حركة المرور باستخدام تكوين التوجيه
تحويل حركة المرور تدريجياً إلى إصدار جديد:
const updateAliasWithRouting = async (functionName, aliasName, routingConfig) => {
const response = await lambdaRequest(`/functions/${functionName}/aliases/${aliasName}`, {
method: 'PUT',
body: {
RoutingConfig: {
AdditionalVersionWeights: routingConfig
}
}
});
return response;
};
// الاستخدام - 10% من حركة المرور إلى الإصدار 6، 90% إلى الإصدار 5
await updateAliasWithRouting('order-processor', 'prod', {
'6': 0.1
});
// بعد التحقق، تحويل 100%
await updateAliasWithRouting('order-processor', 'prod', {});
حالات استخدام الأسماء المستعارة
| الاسم المستعار | الإصدار | الغرض |
|---|---|---|
dev |
$LATEST | اختبار التطوير |
staging |
الأحدث المختبر | التحقق من الجودة |
prod |
إصدار مستقر | حركة مرور الإنتاج |
blue |
الإنتاج الحالي | نشر أزرق-أخضر |
green |
إصدار جديد | نشر أزرق-أخضر |
تعيين مصادر الأحداث
إنشاء محفز SQS
ربط قائمة انتظار SQS بـ Lambda:
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;
};
// الاستخدام
const mapping = await createSQSEventSource(
'order-processor',
'arn:aws:sqs:us-east-1:123456789012:orders-queue',
10
);
console.log(`تم إنشاء مصدر الحدث: ${mapping.UUID}`);
إنشاء محفز تيار DynamoDB
ربط تيار DynamoDB بـ Lambda:
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;
};
// الاستخدام
await createDynamoDBEventSource(
'user-analytics',
'arn:aws:dynamodb:us-east-1:123456789012:table/Users/stream/2026-03-25T00:00:00.000'
);
أنواع مصادر الأحداث
| المصدر | حالة الاستخدام | دعم الدُفعات |
|---|---|---|
| SQS | قوائم انتظار الرسائل | نعم (1-10) |
| Kinesis | تيارات في الوقت الفعلي | نعم (1-10,000) |
| DynamoDB Streams | تغييرات قاعدة البيانات | نعم (1-1,000) |
| S3 | أحداث الكائنات | لا (1 لكل حدث) |
| EventBridge | توجيه الأحداث | نعم |
| API Gateway | واجهات HTTP API | لا |
| Schedule | مهام Cron | لا |
إدارة الطبقات
إنشاء طبقة
تعبئة الكود المشترك/التوابع:
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;
};
// الاستخدام
const layer = await createLayer('shared-utils', {
description: 'أدوات وتوابع مشتركة',
runtimes: ['nodejs20.x', 'nodejs18.x'],
s3Bucket: 'my-layers-bucket',
s3Key: 'shared-utils/v1.zip'
});
console.log(`اسم المورد الخاص بالطبقة (Layer ARN): ${layer.LayerArn}`);
استخدام الطبقات في الدوال
إرفاق الطبقات بالدالة:
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 // مصفوفة من أسماء موارد الطبقات (Layer ARNs)
}
});
return response;
};
// الاستخدام
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'
]
});
التزامن والتوسع
تحديد التزامن المحجوز
حجز السعة للدوال الحيوية:
const putFunctionConcurrency = async (functionName, reservedConcurrentExecutions) => {
const response = await lambdaRequest(`/functions/${functionName}/concurrency`, {
method: 'PUT',
body: {
ReservedConcurrentExecutions: reservedConcurrentExecutions
}
});
return response;
};
// الاستخدام - حجز 100 تنفيذ متزامن
await putFunctionConcurrency('order-processor', 100);
حدود التزامن على مستوى الحساب
| نوع الحساب | الحد الافتراضي | زيادة متاحة |
|---|---|---|
| الطبقة المجانية | 1,000 | نعم |
| الدفع حسب الاستخدام | 1,000 | نعم |
| المؤسسات | 1,000+ | حدود مخصصة |
قائمة التحقق من نشر الإنتاج
قبل النشر إلى الإنتاج:
- [ ] استخدام AWS SDK للتوقيع التلقائي لـ SigV4
- [ ] تطبيق الإصدار باستخدام الأسماء المستعارة
- [ ] تكوين التزامن المحجوز للدوال الحيوية
- [ ] إعداد قوائم انتظار الرسائل غير المرغوب فيها (DLQ) للاستدعاءات غير المتزامنة
- [ ] تمكين تتبع X-Ray للتصحيح
- [ ] تكوين VPC للوصول إلى قاعدة البيانات
- [ ] تنفيذ تسجيل منظم (بتنسيق JSON)
- [ ] إعداد تنبيهات CloudWatch
- [ ] استخدام الطبقات للتوابع المشتركة
- [ ] تنفيذ استراتيجية نشر أزرق-أخضر
حالات الاستخدام الحقيقية
الواجهة الخلفية لـ API
تقوم شركة SaaS ببناء واجهة REST API عديمة الخادم:
- التحدي: حركة مرور متغيرة، توسع غير متوقع
- الحل: Lambda + API Gateway مع التوسع التلقائي
- النتيجة: 99.99% وقت تشغيل، توفير 60% في التكلفة مقارنة بـ EC2
التنفيذ الرئيسي:
- دوال Lambda لكل مورد
- API Gateway للتوجيه/المصادقة
- DynamoDB لتخزين البيانات
- التزامن المجهز لزمن استجابة ثابت
خط أنابيب معالجة الأحداث
منصة تجارة إلكترونية تعالج الطلبات:
- التحدي: ارتفاعات الطلبات أثناء أحداث المبيعات
- الحل: SQS + Lambda مع معالجة الدُفعات
- النتيجة: عدم فقدان أي طلبات، التعامل مع ارتفاعات بمقدار 10x
التنفيذ الرئيسي:
- قائمة انتظار SQS تخزن الطلبات مؤقتًا
- Lambda تعالج 10 رسائل/دفعة
- DLQ للرسائل الفاشلة
- تنبيهات CloudWatch بشأن عمق قائمة الانتظار
الخلاصة
توفر واجهة برمجة تطبيقات AWS Lambda إمكانيات حوسبة عديمة الخادم شاملة. النقاط الرئيسية:
- مصادقة IAM مع توقيع SigV4 (استخدم AWS SDK)
- أنماط استدعاء متزامنة وغير متزامنة
- إدارة الإصدارات والأسماء المستعارة لعمليات النشر
- تعيين مصادر الأحداث لبنى عديمة الخادم
- الطبقات للكود المشترك والتوابع
- Apidog يبسط اختبار API والتعاون بين الفرق
قسم الأسئلة الشائعة
كيف أقوم بالمصادقة باستخدام Lambda API؟
استخدم بيانات اعتماد AWS IAM مع توقيع الإصدار 4. تتعامل AWS SDK مع التوقيع تلقائيًا.
ما الفرق بين الاستدعاء المتزامن وغير المتزامن؟
الاستدعاء المتزامن (RequestResponse) ينتظر اكتمال الدالة ويعيد النتائج. الاستدعاء غير المتزامن (Event) يضع الطلب في قائمة الانتظار ويعود فورًا.
كيف تعمل إصدارات Lambda؟
كل إصدار منشور هو لقطة غير قابلة للتغيير لدالتك. استخدم الأسماء المستعارة للإشارة إلى إصدارات محددة وتمكين تحويل حركة المرور.
ما هي طبقات Lambda؟
طبقات Lambda تقوم بتعبئة الكود والتوابع بشكل منفصل عن كود الدالة، مما يتيح استخدام مكتبات مشتركة عبر دوال متعددة.
كيف أقلل من أوقات البدء الباردة؟
استخدم التزامن المجهز، حزم نشر أصغر، ولغات مجمعة (Go, Rust) للدوال الحساسة للزمن.
ما هو التزامن المحجوز؟
التزامن المحجوز يضمن فتحات تنفيذ لدوال محددة، مما يمنع مشكلات "الجار المزعج".
هل يمكنني تشغيل Lambda من S3؟
نعم، قم بتكوين إشعارات أحداث S3 لاستدعاء Lambda عند إنشاء/حذف الكائنات.
