وظائف Serverless بلغة TypeScript: العمل المتقدم مع AWS Lambda

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

وظائف Serverless بلغة TypeScript: المستوى المتقدم في AWS Lambda

\n\n

أصبحت بنية Serverless المعيار الفعلي لبناء تطبيقات قابلة للتوسع واقتصادية. AWS Lambda هي واحدة من أشهر الخدمات لتنفيذ الوظائف بدون خادم. إذا تم إتقان بناء الجملة الأساسي والمحفزات (API Gateway, S3, DynamoDB)، فقد حان الوقت للتقنيات المتقدمة. في هذه المقالة، سننظر في الجوانب الرئيسية للتطوير الاحترافي لوظائف Lambda بلغة TypeScript: من تحسين البداية الباردة إلى التكامل مع VPC واستخدام الأنماط المعقدة.

\n\n

1. تحسين البداية الباردة وإدارة الذاكرة

\n\n

البداية الباردة (cold start) هي العدو الرئيسي لأداء تطبيقات serverless. في TypeScript، تتفاقم هذه المشكلة بسبب مرحلة التجميع. سننظر في ثلاث طرق رئيسية للمكافحة.

\n\n

1.1. تقليل حجم حزمة النشر

\n

استخدم esbuild للبناء بدلاً من tsc القياسي. يقوم بعملية tree-shaking والتصغير، مما يقلل حجم الحزمة بمقدار 5-10 مرات. مثال على التكوين لـ serverless.yml:

\n\n
plugins:\n  - serverless-esbuild\ncustom:\n  esbuild:\n    bundle: true\n    minify: true\n    sourcemap: false\n    target: 'node18'\n    exclude: ['aws-sdk'] # SDK موجود بالفعل في بيئة Lambda
\n\n

1.2. استخدام Provisioned Concurrency

\n

للوظائف الحساسة للتأخير (مثل معالجة طلبات API)، قم بتكوين Provisioned Concurrency. هذا يحافظ على عدد محدد من الحاويات "الساخنة" قيد التشغيل باستمرار:

\n\n
functions:\n  apiHandler:\n    handler: src/handler.apiHandler\n    provisionedConcurrency: 5 # دائماً 5 حالات جاهزة
\n\n

1.3. تحسين الاستيرادات والكود

\n

تجنب المكتبات "الثقيلة" داخل الوظيفة. على سبيل المثال، بدلاً من استيراد aws-sdk v3 بالكامل، استورد فقط العملاء المطلوبين:

\n\n
// سيء: import * as AWS from 'aws-sdk';\n// جيد:\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
\n\n

2. العمل مع طبقات Lambda والتبعيات

\n\n

تسمح طبقات Lambda بإخراج الكود المشترك والتبعيات (مثل ORM، أدوات التحقق) خارج الوظيفة. هذا يسرع النشر ويقلل حجم كل حزمة فردية.

\n\n

2.1. إنشاء طبقة بأدوات مساعدة مشتركة

\n

يمكن أن يبدو هيكل المشروع كالتالي:

\n\n
project/\n├── layers/\n│   └── common/\n│       └── nodejs/\n│           ├── package.json\n│           └── node_modules/\n├── functions/\n│   ├── createUser.ts\n│   └── getUser.ts\n└── serverless.yml
\n\n

في serverless.yml نقوم بتوصيل الطبقة:

\n\n
layers:\n  commonLibs:\n    path: layers/common\n    compatibleRuntimes:\n      - nodejs18.x\nfunctions:\n  createUser:\n    handler: functions/createUser.handler\n    layers:\n      - { Ref: CommonLibsLambdaLayer }
\n\n

2.2. كتابة الأنواع للطبقات

\n

لكي "يرى" TypeScript الأنواع من الطبقة، قم بإنشاء tsconfig.json مع المسارات:

\n\n
{\n  "compilerOptions": {\n    "paths": {\n      "@common/*": ["layers/common/nodejs/*"]\n    }\n  }\n}
\n\n

الآن يمكنك الكتابة في الوظيفة:

\n
import { validateEmail } from '@common/validators';
\n\n

3. العمل مع VPC والأمان

\n\n

وظائف Lambda التي تعمل داخل VPC تفقد الوصول إلى الإنترنت العام (إذا لم يتم تكوين NAT Gateway). هذا أمر بالغ الأهمية للاتصال بـ RDS أو ElastiCache أو APIs الخاصة.

\n\n

3.1. تكوين Lambda في VPC

\n

التكوين عبر serverless.yml:

\n\n
provider:\n  vpc:\n    securityGroupIds:\n      - sg-12345\n    subnetIds:\n      - subnet-abc\n      - subnet-def\n\nfunctions:\n  dbHandler:\n    handler: src/db.handler\n    vpc: true # يرث إعدادات المزود
\n\n

3.2. نمط "Thin Handler" للاتصالات

\n

قراءة

المدونات

توصيات الكتب