دوال Serverless بلغة TypeScript: دليل كامل لـ AWS Lambda
أحدثت بنية Serverless ثورة في منهجية تطوير الواجهة الخلفية. فبدلاً من إدارة الخوادم، يمكن للمطورين التركيز حصريًا على منطق الأعمال. تُعد AWS Lambda واحدة من أشهر الخدمات لتشغيل دوال serverless. في هذا الدليل، سنشرح إنشاء دوال Lambda وإعدادها ونشرها بلغة TypeScript - من المفاهيم الأساسية إلى حلول الإنتاج.
لماذا TypeScript لـ AWS Lambda؟
يضيف TypeScript الكتابة الثابتة إلى JavaScript، وهو أمر بالغ الأهمية لدوال serverless:
- أمان الأنواع - يمنع الأخطاء في مرحلة الترجمة
- الإكمال التلقائي - تقترح بيئة التطوير المتكاملة (IDE) طرق AWS SDK
- قابلية القراءة - توثق الواجهات والأنواع بنية البيانات
- قابلية التوسع - سهولة صيانة الكود مع نمو المشروع
إعداد المشروع
1. التهيئة وتثبيت التبعيات
أنشئ مشروعًا جديدًا وقم بتثبيت الحزم اللازمة:
mkdir my-lambda-projectcd my-lambda-projectnpm init -y
npm install @types/aws-lambda aws-sdknpm install -D typescript ts-node @types/node2. تكوين TypeScript
أنشئ ملف tsconfig.json:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "lib": ["ES2020"], "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "declaration": true, "declarationMap": true, "sourceMap": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"]}إنشاء أول دالة Lambda
الهيكل الأساسي للمعالج
أنشئ ملف src/handler.ts:
import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
interface UserData { userId: string; name: string; email: string;}
export const handler: Handler<APIGatewayProxyEvent, APIGatewayProxyResult> = async (event) => { try { // تحليل جسم الطلب const body: UserData = JSON.parse(event.body || '{}'); // التحقق من الصحة if (!body.userId || !body.name) { return { statusCode: 400, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ error: 'Missing required fields' }) }; }
// منطق الأعمال const result = { id: body.userId, displayName: body.name.toUpperCase(), createdAt: new Date().toISOString() };
return { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify(result) }; } catch (error) { console.error('Error processing request:', error); return { statusCode: 500, body: JSON.stringify({ error: 'Internal server error' }) }; }};العمل مع البيئة والأسرار
استخدم متغيرات البيئة للتكوين:
import { Handler } from 'aws-lambda';
interface Config { DB_TABLE: string; MAX_RETRIES: number;}
export const handler: Handler = async (event) => { const config: Config = { DB_TABLE: process.env.DB_TABLE || 'default-table', MAX_RETRIES: parseInt(process.env.MAX_RETRIES || '3', 10) };
// استخدم AWS Secrets Manager أو Parameter Store // للبيانات الحساسة return { statusCode: 200, body: JSON.stringify({ table: config.DB_TABLE }) };};