إعادة استخدام حزم Node.js مع دوال AWS Lambda: دليل شامل باستخدام Amplify و Lambda Layers
في عالم الحوسبة السحابية المتسارع، أصبحت التطبيقات بدون خادم (Serverless Applications) حلاً مثالياً للمطورين الذين يسعون لتقليل التكاليف التشغيلية وتجنب إدارة البنية التحتية. يركز هذا المقال على كيفية الاستفادة القصوى من هذه البيئة، وتحديداً في سياق دوال AWS Lambda.
ستتعلم هنا كيفية دمج الحزم البرمجية المخصصة (Custom Packages) ضمن بيئة تشغيل دوال AWS Lambda باستخدام ميزة AWS Lambda Layers القوية. بالإضافة إلى ذلك، سنستعرض إطار عمل AWS Amplify الشامل الذي يبسط عملية تطوير ونشر وتوزيع تطبيقاتك السحابية.
بحلول نهاية هذا الدليل، ستكون قادراً على نشر دوال بدون خادم على AWS من خلال:
- إنشاء واجهة برمجة تطبيقات ويب (Web API) باستخدام
Node.jsوExpress.jsكدالة بدون خادم بواسطة إطار عملAmplify. - حقن حزمة مخصصة في بيئة تشغيل دوال
AWS LambdaباستخدامAWS Lambda Layersلمراقبة طلباتHTTPوتوسيع وظائفها.
المتطلبات الأساسية لبدء العمل
لتحقيق أقصى استفادة من هذا الدليل العملي، ستحتاج إلى إعداد بعض المتطلبات في بيئتك قبل البدء في كتابة الأكواد. تأكد من توفر ما يلي:
- حساب
AWSنشط. - أداة سطر الأوامر
AWS CLIمثبتة ومُهيأة. - بيئة تشغيل
Node.js v14أو أحدث.
مقدمة إلى عالم التطبيقات السحابية وإطار عمل Amplify
تُعد خدمات الويب من أمازون (Amazon Web Services - AWS) واحدة من أبرز المنصات السحابية التي توفر بنية تحتية قوية للتطبيقات بدون خادم. لقد طورت AWS على مر السنين منصات تمكّن الشركات من إطلاق البرامج بشكل أسرع بكثير مما لو اضطروا إلى إعداد وتكوين البنى التحتية بأنفسهم.
إذا كنت على دراية بالتطبيقات بدون خادم، فربما تكون قد سمعت عن إطار عمل Serverless Framework. إنه إطار عمل متعدد السحابات لإدارة البنى التحتية بدون خادم باستخدام ملفات التكوين، ونشر وتشغيل التطبيقات باستخدام أمر واحد. ومع ذلك، لا يزال المطورون بحاجة إلى تثبيت الإضافات وإدارة ملفات التكوين بأنفسهم، وقد يستغرق الأمر وقتاً طويلاً لبناء سير عمل معقد.
إذاً، ما نوع واجهة سطر الأوامر (CLI) التي تفضلها؟ واجهة CLI تسألك عن كل ما تحتاجه، مثل الاتصالات الخارجية (قواعد البيانات، التخزين، قوائم الانتظار، إلخ)، تدفق المصادقة، الأذونات الخارجية، وما إلى ذلك؟ حسناً يا صديقي، أهلاً بك في AWS Amplify.
ما هو AWS Amplify؟
AWS Amplify هو نظام بيئي متكامل يدعم مطوري الواجهة الخلفية (Back-End)، والواجهة الأمامية (Front-End)، ومطوري التكامل. إذا ألقيت نظرة على وثائقه الرسمية، فسترى قائمة ضخمة من المكتبات والأمثلة الممكنة للعمل على تطبيقات الواجهة الخلفية والأمامية على حد سواء.

موقع إطار عمل Amplify
بعد تهيئة AWS CLI وإعداد بيئتك، قم بتشغيل الأمر التالي لتثبيت AWS Amplify عالمياً على جهازك:
npm install -g amplify-cli
بعد ذلك، لنقم بتهيئة دليل عمل عن طريق إنشاء مجلد جديد والدخول إليه:
mkdir app && cd app
الآن، ستقوم بتهيئة مشروع Amplify عن طريق تشغيل الأمر أدناه. للقيام بذلك، ستحتاج إلى تحديد بعض الخيارات في معالج CLI. لاحظ أنه عند المطالبة، يمكنك الضغط على مفتاح Enter على لوحة المفاتيح لاختيار القيم الافتراضية.
amplify init
اختر الخيارات وفقاً للنص الغامق أدناه:
Enter a name for the project:appEnter a name for the environment:devChoose your default editor:Visual Studio Code(أو محرر آخر تفضله)Choose the type of app that you're building:javascriptPlease tell us about your projectWhat javascript framework are you using:noneSource Directory Path:srcDistribution Directory Path:distBuild Command:npm run-script buildStart Command:npm run-script start

تهيئة المشروع المشترك
إنشاء طبقة Lambda (Lambda Layer) مخصصة
خلال الخطوات التالية، سنقوم بإنشاء دالة (Function). ستُستخدم هذه الدالة لتخزين التبعيات (Dependencies) التي سيتم حقنها لاحقاً في الدوال الأخرى ضمن نظام AWS Lambda Functions البيئي. سيقودك الأمر أدناه عبر خطوات إنشاء طبقة Lambda Layer الخاصة بك:
amplify function add
اختر الخيارات وفقاً للنص الغامق أدناه. لاحظ أنه بالنسبة لبيئات التشغيل المتوافقة (compatible runtimes)، ستحتاج إلى الضغط على مفتاح المسافة (space key) على لوحة المفاتيح لتحديد بيئة التشغيل.
Select which capability you want to add:Lambda layer (shared code & resource used across functions)Provide a name for your Lambda layer:apmAgentLayerSelect up to 2 compatible runtimes:NodeJS(اضغطspaceثمEnter)The current AWS account will always have access to this layer. Optionally, configure who else can access this layer. (Hit to skip):Public(أوEnterللتخطي)
بعد هذه الخطوات، ستُنشأ مجلدات وملفات طبقة Lambda Layer في المسار التالي: amplify/backend/function/apmAgentLayer.
تثبيت الوحدات المخصصة (Custom Modules)
بالانتقال إلى مسار الطبقة amplify/backend/function/apmAgentLayer، ربما تكون قد رأيت بعض المجلدات التي أنشأها Amplify. نظراً لأننا نعمل على مشروع Node.js، يجب تثبيت جميع وحدات Node (node modules) في المجلد lib/nodejs.
لقد قمت ببناء مثال لمراقب أداء التطبيقات (Application Performance Monitor - APM) لإظهار كيفية استخدام ميزة Node.js performance hooks لقياس المدة بين الطلبات وتغيير رؤوس استجابة HTTP. سيساعد هذا في إظهار إمكانيات أخرى لتطبيق الشفرة المشتركة وتوسيع سلوك Node.js.

حزمة NPM لقياس المدة بين الطلبات
الخطوة الأولى هنا هي تثبيت التبعيات المشتركة ورفعها إلى AWS. انتقل إلى المسار الذي تم إنشاؤه بواسطة CLI وهو amplify/backend/function/apmAgentLayer/lib/nodejs ثم قم بتثبيت الحزمة باستخدام الأوامر التالية:
cd amplify/backend/function/apmAgentLayer/lib/nodejs
npm i @erickwendel/ew-agent
نشر طبقة Lambda
بمجرد تثبيت حزمتك، يمكنك نشرها وفحصها لاحقاً عبر وحدة تحكم AWS Console. لاحظ أننا لم نضيف أي شفرة بعد؛ الهدف في هذه المرحلة هو فقط إعداد هذه المكتبة للاستخدام المستقبلي. قم بتشغيل الأمر التالي لرفع طبقة Lambda Layer الخاصة بك:
amplify push

تشغيل أمر amplify push وعرض النتائج
إنشاء دالة Web API
في هذه المرحلة، لديك بالفعل مشروع بنية تحتية محلي لـ Amplify جاهز لإضافة مسارات API، وروتينات (Routines)، والربط بخدمات AWS، وما إلى ذلك. سيكون الأمر أدناه مفيداً لإنشاء مشروع قائم على Express.js ودالة AWS Lambda. كما سيربط الدالة بطبقة AWS Lambda Layer التي أنشأتها للتو وسيعرضها على AWS API Gateway.
amplify api add
اختر الخيارات وفقاً للنص الغامق أدناه:
Please select from one of the below mentioned services:RESTProvide a friendly name for your resource to be used as a label for this category in the project:myApiProvide a path (e.g., /book/{isbn}):/hiChoose a Lambda source:Create a new Lambda functionProvide a friendly name for your resource to be used as a label for this category in the project:myApiProvide the AWS Lambda function name:myApiChoose the runtime that you want to use:NodeJSChoose the function template that you want to use:Serverless ExpressJS function (Integration with API Gateway)Do you want to access other resources in this project from your Lambda function?:NoDo you want to invoke this function on a recurring schedule?:NoDo you want to configure Lambda layers for this function?:YesProvide existing layers or select layers in this project to access from this function (pick up to 5):apmAgentLayer(اضغطspaceثمEnter)Select a version for apmAgentLayer:1Do you want to edit the local lambda function now?:Yes
بما أنني أستخدم VSCode، فإن الإجابة الأخيرة في المعالج ستفتح ملف app.js في محرري حتى أتمكن من التعديل. الآن، دون إضافة تبعيات أخرى، دعنا نستورد وحدة طبقة Lambda Layer المشتركة في السطر الأول من هذا الملف باستخدام الشفرة أدناه:
require('@erickwendel/ew-agent').start()

الكود المضاف في بداية الملف
بعد تحرير الملف، انتقل إلى الطرفية (terminal) واضغط على Enter واختر الإجابات الموضحة بالخط العريض أدناه:
Restrict API access:NoDo you want to add another path?:No
نشر واختبار API في بيئة الإنتاج
في وقت كتابة هذا الدليل، لا يمكننا اختبار طبقات Lambda Layers محلياً باستخدام AWS Amplify. ولكنك ستقوم بنشر مشروعك إلى AWS واختباره في بيئة الإنتاج عن طريق تشغيل الأمر amplify push مرة أخرى. لاحظ أنه سيطبع الموارد التي تحتاج إلى تحديث والموارد التي سيتم إنشاؤها في هذا النشر. قد يستغرق الأمر بعض الوقت لإجراء جميع العمليات، ويجب أن يبدو إخراجك كما هو موضح أدناه:
amplify push

نشر API
كما قد أظهرت لك الطرفية، أصبح لواجهة برمجة التطبيقات (API) الآن عنوان URL. عنوان URL الذي تم إنشاؤه لي هو https://nlq7x7onj0.execute-api.us-east-1.amazonaws.com/dev والمسار سيكون /hi، والذي أنشأناه معاً في الخطوات السابقة. دعنا نطلق طلباً باستخدام cURL (أو حتى متصفحك) لنرى ما يحدث:
curl -i https://nlq7x7onj0.execute-api.us-east-1.amazonaws.com/dev/hi
بعد تشغيله، يجب أن تستجيب واجهة API باستجابة JSON بالمحتوى التالي: {"success":"get call succeed!","url":"/hi"}. تم حقن طبقة Lambda Layer وكان يجب أن تكون قد غيرت رؤوس الاستجابة (response headers) الخاصة بك بإضافة المفتاحين x-instrumented-by و x-request-id كما يلي:
x-instrumented-by: ErickWendel
x-request-id: 5ddf1343-e42e-4e33-b1e1-936c303c14c8
إذا كنت فضولياً بشأن ما قام Amplify بإدارته لك خلال هذا الدليل، فقم بتشغيل amplify console وتصفح لوحة التحكم. يمكنك رؤية لوحة التحكم الخاصة بي أدناه:
amplify console

لوحة التحكم وعرض سجلات الدالة على AWS
تنظيف الموارد
لإزالة جميع الموارد التي أنشأها Amplify، قم بتشغيل الأمر التالي:
amplify delete
الخاتمة
هناك العديد من الطرق لتحسين تجربتك في بناء التطبيقات بدون خادم. يمكن لإطار عمل Amplify Framework أن يساعدك في بناء تطبيقات الجيل التالي وتجنب المهام المتكررة. تحقق من الوثائق الرسمية للاطلاع على إمكانيات أخرى لبناء واجهات API قوية باستخدام تقنيات متطورة مثل GraphQL و AWS AppSync. أنا متأكد من أنه سيساعدك كثيراً!
شكراً لك على القراءة، أقدر حقاً الوقت الذي قضيناه معاً. آمل أن يكون هذا المحتوى أكثر من مجرد نص. آمل أن يكون قد جعلك مفكراً أفضل ومبرمجاً أفضل أيضاً. تابعني على Twitter واطلع على مدونتي الشخصية حيث أشارك كل محتواي القيم. إلى اللقاء!
الخلاصة التقنية
يُبرهن هذا الدليل بوضوح على القيمة الكبيرة لإعادة استخدام الحزم في بيئة AWS Lambda عبر Lambda Layers، خاصة عند دمجها مع قوة AWS Amplify. إن الاستفادة من Lambda Layers تُمكّن المطورين من تحقيق فصل نظيف للتبعيات، مما يقلل من حجم حزم الدوال، ويسرّع من أوقات النشر، ويُحسن من قابلية الصيانة. من جانبها، تعمل Amplify كجسر فعال بين المطور والبنية التحتية المعقدة لـ AWS، مما يُسهّل عمليات التهيئة والنشر والتكامل مع خدمات AWS الأخرى بشكل كبير. هذا النهج لا يُعزز فقط كفاءة التطوير، بل يضمن أيضاً بنية تطبيق أكثر مرونة وقابلية للتوسع، وهو أمر حيوي في مشهد الحوسبة السحابية الحديث.