TL;DR
تمكنك واجهة برمجة تطبيقات AWS Lambda من نشر الدوال عديمة الخادم وإدارتها واستدعائها برمجياً. تعتمد على مصادقة IAM، وتقدم نقاط نهاية RESTful لإدارة الدوال، وتدعم أنماط استدعاء متزامنة وغير متزامنة، مع سيطرة على حدود التزامن على مستوى الحساب. سيوجهك هذا الدليل خطوة بخطوة لإعداد المصادقة، ونشر الدوال، وأنماط الاستدعاء، وتعيين مصادر الأحداث، واستراتيجيات بنية عديمة الخادم الجاهزة للإنتاج.
مقدمة
تعالج AWS Lambda تريليونات الطلبات شهرياً لأكثر من مليون مستخدم نشط. إذا كنت تبني تطبيقات عديمة الخادم أو خطوط أتمتة أو بنى قائمة على الأحداث، فإن التكامل مع Lambda API أساسي للبنية التحتية كرمز ولأتمتة CI/CD.
الفرق التي تدير أكثر من 50 دالة Lambda يدوياً تخسر 10-15 ساعة أسبوعياً في عمليات النشر والتحديثات والمراقبة. تكامل 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 | تطبيقات الويب |
| مخصص | أي | أوقات تشغيل قائمة على الحاويات |
بنية واجهة برمجة التطبيقات
بنية نقطة النهاية:
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. يمكنك استخدام الكود التالي لتوقيع الطلبات (Node.js مثال عملي):
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);
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}`;
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}`;
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');
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 عبر API:
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 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}`);
استدعاء تجريبي
اختبر أذونات IAM دون تنفيذ الدالة:
const dryRunInvocation = async (functionName) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'DryRun'
}
});
return response;
};
// الاستخدام
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
}
});
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;
};
// الاستخدام
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 عند إضافة أو حذف كائنات.
Top comments (0)