كما توجد الحاسوبة بدون خادوم كانت ردا على التحديات التي تواجه الأنظمة التقليدية مبنية على الخوادم. مع الحاسوبة بدون خادوم، لم يعد المطورون بحاجة إلى إدارة أو توسيع الخوادم يدويا. بدلاً من ذلك، يتحكم مزودو الحوسبة السحابية بإدارة البنية التحتية، مما يسمح للفرق بالتركيز فقط على كتابة وتشغيل الشفرة.

حلول الحاسوبة بدون خادوم تتوسع تلقائياً وفقاً للطلب وتقدم نموذج الدفع-بالاستخدام. هذا يعني أنك تدفع فقط للموارد التي يستخدمها تطبيقك فعلياً. هذه المقاربة تقلل بشكل كبير من عدد الأعمال التشغيلية، تزيد من اللياقة وتسرع دورات التطوير، مما يجعلها خيار جذاب لتطوير التطبيقات الحديثة.

بإعادة تصوير إدارة الخوادم، تسمح منصات الحاسوبة بدون خادوم لك بالتركيز على منطق الأعمال ووظائف التطبيق. هذا يؤدي إلى تسريع التشغيل والمزيد من الإبتكار. أيضاً تتمحور أنظمة الحاسوبة بدون خادوم على الحدث، مما يعني أنها يمكن أن تستجيب تلقائياً للأحداث الفعلية وتتوسع لمواكبة الطلبات بدون تدخل يدوي.

القائمة الخاصة بالمحتويات

  1. مفاهيم مهمة للفهم

  2. الأحتياجات السابقة

  3. حالة استخدامنا

  4. أهداف الدرس التعليمي

  5. كيفية البدء: توزيع المخزون الGit

  6. خطوة 1: تأسيس بيئة الشبكة غير المتوازية

  7. خطوة 2: تعريف الAPI في الملف YAML للشبكة غير المتوازية

  8. الخطوة 3: تطوير وظائف Lambda لعمليات CRUD

  9. خطوة 4: إنشاء خط توليد التكنولوجيا المتعددة المراحل للتوزيعات المتعددة الحيوية للبيئات التطويرية والإنتاجية

  10. خطوة 5: اختبار الخطوط التطويرية والإنتاجية

  11. خطوة 6: اختبار وتحقيق الAPI التطويرية والإنتاجية باستخدام Postman

  12. ختام

قبل أن نغير إلى التفاصيل التقنية، سنذهب برجاءً إلى بعض مبادئ الخصوصية الأساسية.

مفاهيم مهمة للفهم

واجهة برمجة التطبيق (API)

واجهة برمجة التطبيق (API) تسمح للتطبيقات البرمجية المختلفة بالتواصل والتفاعل مع بعضها البعض. تحدد طرق الطلب وتنسيقات البيانات التي يستطيع التطبيقات استخدامها لطلب وتبادل المعلومات للتكامل ومشاركة البيانات بين الأنظمة المختلفة.

طرق HTTP

طرق HTTP أو طرق الطلب هي جزء حاسم للخدمات الويب والAPIs. يشير الى الإجراء المنشود الذي يجب إنجازه على المورد في عنوان URL الطلب.

أكثر الطرق المستخدمة في API RESTful هي:

  • GET: يستخدم لاسترجاع البيانات من الخادم

  • POST: يرسل البيانات، التي تتضمن في جسم الطلب، لإنشاء أو تحديث مورد

  • PUT: يحدث أو يستبدل مورد موجود أو ينشئ مورد جديد إذا لم يكن موجوداً

  • DELETE: يحذف البيانات المحددة من الخادم.

Amazon API Gateway

توفر خدمة Amazon API Gateway خدمة مديرة تمامًا والتي تجعل من السهل على المطورين إنشاء ونشر وصيانة ومراقبة وأمن APIs بمقياس كبير. تعمل كنقطة الدخول لعدة APIs، وتدير وتتحكم في التفاعلات بين العملاء (مثل التطبيقات الويب أو المحمولة) وخدمات الخلفية.

توفر أيضًا وظائف متعددة، بما في ذلك توجيه الطلبات، الأمن، التوثيق، التخزين المؤقت وحدود التنقل السريع التي تسهل إدارة وتوجيه APIs.

Amazon DynamoDB

DynamoDB هو خدمة قاعدة بيانات NoSQL مديرة تمامًا مصممة للمقياس العالي، والتأخير النادر وتكرار البيانات عبر مناطق متعددة.

تخزن DynamoDB البيانات في تنسيق بدون قاعدة، مما يسمح بتخزين واسترجاع مرن وسريع للبيانات المنظمة والمنظمة نصفيًا. تستخدم عادة لبناء تطبيقات قابلة للتحجيم والاستجابة في البيئات السحابية.

تطبيق بدون خادم CRUD

يشير تطبيق بدون خادم CRUD إلى القدرة على إنشاء، قراءة، تحديث وحذف البيانات. ولكن البنية التحتية والمكونات المعنية تختلف عن التطبيقات التقليدية القائمة على الخوادم.

إنشاء يشمل إضافة إدخالات جديدة إلى جدول DynamoDB. العملية قراءة تستخرج البيانات من جدول DynamoDB. تحديث يحدث البيانات القائمة في DynamoDB. والعملية حذف تحذف البيانات من DynamoDB.

الإطار البدون خادم

النسق التنزيلي الخالٍ من الخوادم (Serverless Framework) هو أداة مفتوحة المصدر التي تبسيط عملية توزيع وإدارة تطبيقات الخوادم الخالية عبر مزودي السحاب المتعددين، بما فيهم AWS. يعتمد على تجريد التعقيد من توفير وإدارة البنية التحتية بسماح للمطورين بتحديد بنيتهم كوداً باستخدام ملف YAML.

يتم الإنتظام بإدارة النسق لتوزيع وتوسيع وتحديث الوظائف الخالية من الخوادم، وAPIs ومصادر أخرى.

GitHub Actions

GitHub Actions هو أداة قوية للوصول إلى تلقائي للموارد البشرية وتوسيع التوسعة التي تسمح للمطورين بتلقيح أعماليات نرمياتهم مباشرة من مستودع GitHub الخاص بهم.

مع GitHub Actions، يمكنك إنشاء أنابيب تلقائية مخصصة تتم إشارتها بأحداث مثل الدفعات الشعبية للكود، أو طلبات الإجماع، أو دمج الفرع. تتم تعريف هذه الأعماليات في ملفات YAML داخل المستودع ويمكنها إجراء مهام مثل الاختبار، بناء وتوزيع التطبيقات إلى بيئات مختلفة.

Postman

Postman هو منصة تعاونية شائعة تبسيط عملية تصميم واختبار وتوثيق API. تقدم واجهة مستخدم سهلة الاستخدام للمطورين لإنشاء وإرسال طلبات HTTP، اختبار نقاط الوصول للAPI وتلقيح أعماليات الاختبار التلقائي.

حسنا، بما أنك الآن مألوفاً بالأدوات والتقنيات التي سنستخدمها هنا، دعونا نغوص في الأمر.

الشروط الأساسية

  • Node.js و npm مثبتان

  • CLI AWS مكون بواسطة الوصول إلى حساب AWS الخاص بك

  • حساب Serverless Framework

  • تثبيت Framework Serverless عالمياً في CLI محليك

حالة استخدامنا

ألتقي بأليكس، رائدة أعمال تعلمت مؤخراً عن الهندسة البلاسيرفر. قرأت عن كيف أنها طريقة قوية وفعالة لبناء الخلفيات للتطبيقات الويب، تقدم نهجاً حديثاً لتطوير تطبيقات الويب.

تريد تطبيق ما تعلمته حتى الآن عن مبادئ AWS البلاسيرفر. تعرف أن البلاسيرفر لا يعني عدم وجود السيرفرات بل يعتمد عن إبعاد إدارة وتوفير السيرفرات. والآن تريد التركيز فقط على كتابة الكود وتطبيق منطق الأعمال.

دعونا نرى كيف تبدأ أليكس، مالكة مقهى القهوة الناجح، بإستغلال الهندسة البلاسيرفر للخلفية من تطبيق الويب.

مقهى أليكس للقهوة الجدير، متجر ويب للقهوة يقدم مجموعة من تركيبات القهوة والمتاع. في البداية، إدارت أليكس طلبات المقهى ومخزونها بخدمات وعمليات الاستضافة التقليدية، حيث كانت تتحكم بعدد من السيرفرات والموارد. ولكن بما أن مقهى القهوة تزداد شعبية، بدأت تواجه عدداً متزايداً من الطلبات، خصوصاً أثناء الساعات العصية والترويجات الاستوائية.

إدارة السيرفرات وضمان قدرة التطبيق على التعامل مع الزيادة في الزحام أصبحت تحدياً لأليكس. وجدت نفسها تقلق باستمرار عن قدرات السيرفر، والقدرة على التوسع، وتكاليف الحفاظ على البنية التحتية.

أيليك أيضًا أرادت تقديم ميزات جديدة مثل توصيات شخصية وبرامج ال忠诚ية، لكن هذا أصبح مهمةً معقدة بسبب قيود تجهيزها التقليدي.

ثم علمت المفهوم الذي يطلق عليه تشغيل الخلال، وقارنت خلال الأسفل بالقهوة التي يقوم بتكرارها آليًا وبدون إلمامها بتفاصيل تعقيدة من عملية إنجاز القهوة.

تحمست أيليك لهذه الفكرة، وقررت تحويل خلال منزلها الخلالي إلى وسط قابل للتوسعة بواسطة منصة AWS Lambda، وقناة API AWS وقاعدة تعليمات Amazon DynamoDB. سيسمح لها هذا الإعداد بتركيز أكثر على صنع مزيجات القهوة المثالية والمتفائلة لزبائنها.

مع الخلال، يصبح أوامر الزبائن المشتركين أحد الأحداث التي تتسبب في تنشيط سلسلة من الوظائف الخلالية. وتشغيل وظائف AWS Lambda منفصلة تعالج الأوردات وتقوم بجميع المنطقة التجارية خلف الكواليس. على سبيل المثال، تخلق أوردة الزبائن وقادرة على استرجاع تلك الأوردة. يمكنها أيضًا حذف أوردة زبائن ما أو تحديث حالة الأوردة.

لم يعد أيليك تقلقًا حول إدارة الخوادم، لأن منصة الخلالية تنتقل تواليًا وإنخفاضًا وفقًا لطلبات إرسال الأوردات. أيضًا تمثل كلفة الخلالية تخفيض كبير لأيليك. بنموذج دفع مقارن مع ما تستهلكه وظائفها الخلالية للوقت المعقول ، ما يوفر لها حلول أقل تكاليفًا لتنمو المشروع التجاري المتزايد.

لكنها لا تتوقف هناك! بل أيضًا تريد أتمتة كل شيء، من إنشاء البنية التحتية إلى تحديث تطبيقها عندما يحدث تغيير جديد. من خلال استخدام البنية التحتية ككود (IaC) مع الإطار البيزار، يمكنها تحديد كل بنية تحتيتها في الكود وإدارتها بسهولة.

على رأس ذلك، تقوم بإعداد GitHub Actions للتوحد التام والتوزيع المستمر (CI/CD),حتى أن كل تغيير يقوم به يتم توزيعه تلقائياً من خلال قاعدة، سواء كانت ميزة جديدة في التطوير أو تصليح سريع للإنتاج。

أهداف التعليمية

  • إعداد بيئة الإطار البيزار

  • تعريف API في ملف YAML

  • تطوير دوال AWS Lambda لمعالجة عمليات CRUD

  • إعداد توزيع متعدد المراحل للتطوير والإنتاج

  • اختبار خطوط التطوير والإنتاج

  • اختبار وتصديق APIs التطوير والإنتاج باستخدام Postman

كيفية البدء: استنسخ مستودع Git الخاص بك

لتعزيز فهمك ولتمريرك مع الدرس التعليمي بشكل أكثر فعالية، قم بنسخ مخزون المشروع من قاعدة البيانات GitHub الخاصة بي. يمكنك فعل ذلك بالذهاب إلى هنا. حينما نتقدم بالأمور، تفضل بمساعدتك في تحرير الملفات بما يلزم.

بعد نسخ المخزون، ستلاحظ وجود مجموعة من الملفات في مجلدك، كما ترون في الصورة أدناه. نستخدم جميع هذه الملفات لبناء واجهة القهوة الخالية من ال服务器.

خطوة 1: إعداء 环境 الواجهة الخالية من ال服务器

لإعداء 环境 الواجهة الخالية من ال服务器 للتنفيذات الautomated، سيتوجب عليك تحقيق توثيق حسابك لواجهة الخالية من ال服务器 عبر الواجهة ال命令行.

هذا يتطلب إنشاء مفتاح دخول يمكن توفير الخطأ المتوالي والتنفيذ الإلكتروني وتسخير واجهة الخالية من ال服务器 لتأكيد الدخول بسلامة بدون تعريف برمتعتك. عن طريق الدخول إلى حسابك الخالية من ال服务器 وتوليد المفتاح، يمكن للخطأ المتوالي تنفيذ تطبيقك الخالي من ال服务器 من ملف التكوين التنفيذي.

لقيام بذلك، اذهب إلى حسابك الخالية من ال服务器 وتنقل إلى قسم المفاتيح الدخولية. انقر على “+add”، قم بتسميته “SERVERLESS_ACCESS_KEY”، ثم أنشئ المفتاح.

بمجرد إنشاء مفتاحك الدخولي، تأكد من نسخه بسلامة. ستستخدم هذا المفتاح كما تعرف كمتغير سري في مجلدك الموجود في GitHub لتأكيد وتسمية خطأ المتوالي الخاص بك.

سيوفر الوصول إلى حساب Framework Serverless خلال عملية التوزيع. ستضيف هذا المفتاح إلى سرائر مستودع GitHub لاحقًا، بحيث يستطيع الأنبوب إستخدامه بأمان لتوزيع موارد الخدمات بدون الإفصاح عن المعلومات الحساسة في قاعدة برمجتك.

الآن، دعونا نحدد موارد AWS ككود في ملف severless.yaml.

خطوة 2: تحديد الAPI في ملف YAML لServerless

في هذا الملف، ستحدد البنية التحتية الأساسية والوظائف الخاصة بAPI مقهى القهوة باستخدام تكوين YAML للآلية Serverless Framework.

هذا الملف يحدد الخدمات AWS التي يستخدمها، بما في ذلك واجهة API، وظائف Lambda للعمليات CRUD، وDynamoDB لتخزين البيانات.

ستقوم أيضًا بتكوين دورة IAM بحيث تتمكن وظائف Lambda من الحصول على الصلاحيات اللازمة للتفاعل مع خدمة DynamoDB.

واجهة API مكونة بطريقة صحيحة بواسطة تأشيرات HTTP (POST، GET، PUT، و DELETE) لمعالجة الطلبات الواردة وتشغيل الوظائف Lambda المقابلة.

لنتحقق من الكود:

service: coffee-shop-api
frameworkVersion: '4'

provider:
  name: aws
  runtime: nodejs20.x
  region: us-east-1
  stage: ${opt:stage}
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - dynamodb:PutItem
            - dynamodb:GetItem
            - dynamodb:Scan
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
          Resource: arn:aws:dynamodb:${self:provider.region}:*:table/CoffeeOrders-${self:provider.stage}

functions:
  createCoffee:
    handler: createCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: post

  getCoffee:
    handler: getCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: get

  updateCoffee:
    handler: updateCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:  
          path: coffee  
          method: put  

  deleteCoffee:  
    handler: deleteCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: delete
resources:
  Resources:
    CoffeeTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: CoffeeOrders-${self:provider.stage}
        AttributeDefinitions:
          - AttributeName: OrderId
            AttributeType: S
          - AttributeName: CustomerName
            AttributeType: S
        KeySchema:
          - AttributeName: OrderId
            KeyType: HASH
          - AttributeName: CustomerName
            KeyType: RANGE
        BillingMode: PAY_PER_REQUEST

تكوين serverless.yml يحدد كيفية تشغيل API مقهى Alyx في بيئة بدون خادم على AWS. القسم provider يحدد أن التطبيق سيستخدم AWS كمزود السحابة، مع Node.js كبيئة التشغيل.

يتم تعيين المنطقة في us-east-1 ومتغير stage يسمح للتوزيع الديناميكي عبر البيئات المختلفة، مثل dev و prod. هذا يعني أن نفس البرمجيات يمكن تنفيذها في البيئات المختلفة، والموارد تطلب تسمياتها بشكل ديناميكي لتجنب التعارضات.

في قسم iam، يتم تمويل أذكار المجال للمؤلفات اللامبادية للتفاعل مع جدول DynamoDB. تلك التكنولوجيا المتغيرة ${self:provider.stage} تسمي مجددًا جدول DynamoDB بطريقة ديناميكية، لذلك يتم تكوين موارد منفصلة لكل بيئة، مثل CoffeeOrders-dev للبيئة التطويرية و CoffeeOrders-prod للإنتاج. تلك التسمية الدينامية تساعد في إدارة عدة بيئات دون تكوين جداول منفصلة يدويًا لكل منها.

قسم functions يحدد الأربع مؤلفات اللامباديات الجوهرية، createCoffee، getCoffee، updateCoffee و deleteCoffee، وهي تقوم بعمليات CRUD ل API المتجر القهوي.

كل من المؤلفات متصل بطريقة معينة من الأشكال الإلكترونية في API Gateway، مثل POST، GET، PUT و DELETE. تتفاعل هذه المؤلفات مع جدول DynamoDB المسمي ديناميكيًا وفقًا للمرحلة الحالية.

يحدد القسم الأخير resources جدول DynamoDB بحديث. يضع الجدول بالخصائص OrderId و CustomerName، التي تستخد

بواسطة توطين التيار الآلي لتلك الموارد باستخدام إطار Serverless Framework، يمكن لأليكس أن تدير بسهولة بنيةها البنكية، مما يحررها من عبء توفير وتحجيم الموارد يدوياً.

الخطوة 3: تطوير وظائف Lambda للعمليات CRUD

في هذه الخطوة، ننطوي العملية الجوهرية لAPI مقهى أليكس بإنشاء وظائف Lambda بلغة جافاسكريبت التي تقوم بالعمليات الأساسية CRUD createCoffee، getCoffee، updateCoffee و deleteCoffee.

هذه الوظائف تستخدم مجموعة SDK من AWS للتفاعل مع خدمات AWS، وخصوصاً DynamoDB. سيكون كل وظيفة مسؤولة عن تعامل طلبات API محددة مثل إنشاء طلب، استرجاع الطلبات، تحديث حالات الطلب، وحذف الطلبات.

وظيفة Create Coffee Lambda

هذه الوظيفة تقوم بإنشاء طلب القهوة:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
const { v4: uuidv4 } = require('uuid');

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const customerName = requestBody.customer_name;
  const coffeeBlend = requestBody.coffee_blend;
  const orderId = uuidv4();

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Item: {
      OrderId: orderId,
      CustomerName: customerName,
      CoffeeBlend: coffeeBlend,
      OrderStatus: 'Pending'
    }
  };

  try {
    await dynamoDb.put(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order created successfully!', OrderId: orderId })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not create order: ${error.message}` })
    };
  }
};

هذه الوظيفة Lambda تتعامل مع إنشاء طلب جديد في جدول DynamoDB. أولاً نستورد مجموعة SDK من AWS ونقوم بإعداد DynamoDB.DocumentClient للتفاعل مع DynamoDB. يتم استيراد مكتبة uuid أيضاً لتوليد معرفات طلبات فريدة.

داخل الوظيفة handler، نحلل جسم الطلب الوارد لاستخراج معلومات الزبون، مثل الاسم والمزيج المفضل من القهوة. يتم إنشاء orderId فريد بإستخدام uuidv4() ويجهز هذه البيانات للإدراج في DynamoDB.

الكائن params يحدد الجدول حيث سيتم تخزين البيانات، مع TableName يُعيد تعيينها ديناميكيا إلى قيمة متغير البيئة COFFEE_ORDERS_TABLE. الطلب الجديد يتضمن حقول مثل OrderId، CustomerName، CoffeeBlend، وحالة مبدئية من Pending.

في البلوك try، يحاول الكود إضافة الطلب إلى جدول DynamoDB باستخدام طريقة put(). إذا نجح الأمر، سترجع الوظيفة رمز الحالة 200 مع رسالة نجاح و OrderId. إذا حدث خطأ، يلتقط الكود ذلك ويرجع رمز الحالة 500 مع رسالة الخطأ.

Get Coffee Lambda function

هذه الوظيفة تسترجع جميع أشياء القهوة:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async () => {
  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE
  };

  try {
    const result = await dynamoDb.scan(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(result.Items)
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not retrieve orders: ${error.message}` })
    };
  }
};

هذه الوظيفة Lambda تكون مسؤولة عن استرجاع جميع طلبات القهوة من جدول DynamoDB وتعرض منهجة بدون خادم لاسترجاع البيانات من DynamoDB بطريقة قابلة للتحجيم.

نستخدم مجدداً برنامج الواجهة البرمجية AWS SDK لإعداد مثال لـ DynamoDB.DocumentClient للتفاعل مع DynamoDB. يقوم الكود الرئيسي handler ببناء الكائن params، ويحدد TableName، والذي يُعيد تعيينه ديناميكيا باستخدام متغير البيئة COFFEE_ORDERS_TABLE.

يجمع scan() طريقة جميع البنود من الجدول. مرة أخرى، إذا كان العملية ناجحة، فإن تلك الوظيفة تعود برمز 200 مع البنود المجموعة بالصيغة الJSON. في حالة وقوع خطأ، ستعود رمز 500 ورسالة الخطأ.

وظيفة تحديث القهوة لامبادال

يتم تحديث عنصر القهوة بواسطة معرفته الصافية:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const { order_id, new_status, customer_name } = requestBody;

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Key: {
      OrderId: order_id,
      CustomerName: customer_name
    },
    UpdateExpression: 'SET OrderStatus = :status',
    ExpressionAttributeValues: {
      ':status': new_status
    }
  };

  try {
    await dynamoDb.update(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order status updated successfully!', OrderId: order_id })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not update order: ${error.message}` })
    };
  }
};

يتم تعامل هذه الوظيفة بتحديث حالة أمر محصل للقهوة الخاصة في جدول DynamoDB.

تستخدم handler وظيفة لاستخراج order_id، new_status و customer_name من جسم ال solicitud. يمكن من ثم بناء params مجموعة لتحديد أسم الجدول والمفاتيح الرئيسية للأمر (باستخدام OrderId و CustomerName). UpdateExpression تعين حالة الأمر الجديدة للأمر.

في ال try قام البرمجيات بمحاولة تحديث الأمر في DynamoDB بواسطة طريقة update(). ومرة أخرى بالطبع، إذا كان هذا العمل ناجحاً، ستعود الوظيفة برمز 200 مع رسالة النجاح. إذا وقع خطأ، ستتمكن من صيانة الخطأ وستعود رمز 500 مع رسالة الخطأ.

وظيفة حذف القهوة لامبادال

هذه الوظيفة تحذف العنصر القهوة بواسطة معرفته الصافية:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const { order_id, customer_name } = requestBody;

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Key: {
      OrderId: order_id,
      CustomerName: customer_name
    }
  };

  try {
    await dynamoDb.delete(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order deleted successfully!', OrderId: order_id })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not delete order: ${error.message}` })
    };
  }
};

plaintext
الوظيفة Lambda تحذف أمر القهوة الخاص من جدول DynamoDB. في وظيفة الهندلر، يحلل الكود جسم الطلب لاستخراج order_id و customer_name. تستخدم هذه القيم كمفتاح رئيسي لتحديد العنصر الذي سيتم حذفه من الجدول. الكائن params يحدد اسم الجدول والمفتاح للعنصر الذي سيتم حذفه.

في البلوك try، يحاول الكود الحذف الأمر من DynamoDB باستخدام طريقة delete(). إذا نجحت، ستعيد مرة أخرى رمز الحالة 200 مع رسالة نجاح، مؤكدة أن الأمر قد تم حذفه. إذا حدث خطأ، يلتقط الكوده ويرجع رمز الحالة 500 مع رسالة الخطأ.

بعد أن أوضحنا كل وظيفة Lambda، دعونا نقوم بإعداد خطوط عرض متعددة للتسليم.

خطوة 4: إعداد خطوط عرض CI/CD متعددة الأشكال لبيئات التطوير والإنتاج

لإعداد سرائات AWS في مستودع GitHub الخاص بك، ابحث أولاً إلى إعدادات المستودع. حدد إعدادات في أعلى اليمين، ثم انتقل إلى أسفل اليسار وحدد الأسرار والمتغيرات.

بعد ذلك، انقر على الإجراءات كما هو موضح في الصورة أدناه:

من هنا، حدد سر جديد للمستودع لإنشاء الأسرار.

يحتاج إلى إنشاء ثلاثة أسرار لخطوطك الإنتاجية، AWS_ACCESS_KEY_ID، AWS_SECRET_ACCESS_KEY، و SERVERLESS_ACCESS_KEY.

إستخدم معرفات مفتاح الوصول لحساب AWS الخاص بك للمتغيرين الأولين، ثم استخدم مفتاح الوصول الخاضع للبدون خدمات سابقًا المحفوظ لإنشاء SERVERLESS_ACCESS_KEY. ستستخدم هذه الأسرار للتوثيق الآمن لخط الإنتاج CI/CD كما هو مرئي في الصورة أدناه.

تأكد من أن الفرع الرئيسي يُسمى “main“، لأنه سيعمل كالفرع الإنتاجي. بعد ذلك، قم بإنشاء فرع جديد يُسمى “dev” للعمل التطويري.

يمكنك أيضًا إنشاء فروع محددة للميزات، كـ “dev/feature“، للتطوير بصورة أكثر تفصيلية. ستستخدم GitHub Actions هذه الفروع لتوسيع التغييرات تلقائيًا، بحيث يمثل dev البيئة التطويرية ويمثل main الإنتاج.

تتيح هذه استراتيجية الفروع إدارة خط الإنتاج CI/CD بفعالية، حيث يتم تمرير تغييرات الكود الجديدة عندما يتم دمجها في إما البيئة التطويرية أو الإنتاجية.

كيفية استخدام GitHub Actions لتنفيذ ملف YAML

لتوطين العملية الإنفاقية لواجهة برمجة التطبيق لمقهى القهوة، ستستخدم GitHub Actions الذي يتمدد مع مستودع GitHub الخاص بك.

سيتم تحريك هذا الخط الإنفاقي عندما يتم نقل الكود إلى الفروع الرئيسية أو الفرع التطويري. من خلال تكوين التوسيع للتصدير الحسب البيئة، ستؤكد أن التحديثات إلى الفرع التطويري تنتشر إلى البيئة التطويرية، بينما تُشغيل التغييرات التي يتم إجراؤها في الفرع الرئيسي للإنتاج.

الآن، دعونا نراجع الكود:

name: deploy-coffee-shop-api

on:
  push:
    branches:
      - main
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '20.x'

    - name: Install dependencies
      run: |
        cd coffee-shop-api
        npm install

    - name: Install Serverless Framework
      run: npm install -g serverless

    - name: Deploy to AWS (Dev)
      if: github.ref == 'refs/heads/dev'
      run: |
        cd coffee-shop-api
        npx serverless deploy --stage dev
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        SERVERLESS_ACCESS_KEY: ${{secrets.SERVERLESS_ACCESS_KEY}}

    - name: Deploy to AWS (Prod)
      if: github.ref == 'refs/heads/main'
      run: |
        cd coffee-shop-api
        npx serverless deploy --stage prod
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        SERVERLESS_ACCESS_KEY: ${{secrets.SERVERLESS_ACCESS_KEY}}

plaintext
الإشارات YAML لGitHub Actions هي ما يوصل العملية التلقائية لتصدير API مقهى القهوة إلى AWS باستخدام إطار Serverless Framework. يتم تشغيل الوِركفلو عندما يتم إرسال تغييرات إلى الفرعين الرئيسي أو dev.

يبدأ بإشراف الكود الموجود في المستودع، ثم إعداد Node.js بالنسبة إلى النسخة 20.x لتطابق الزمن التشغيل المستخدم من قبل وظائف Lambda. بعد ذلك، يثبت الإعتمادات الخاصة بالمشروع بالذهاب إلى الدليل coffee-shop-api وتنفيذ npm install.

يثبت الوِركفلو أيضًا إطار Serverless Framework على الصعيد العالمي، مما يسمح بإستخدام CLI الخاص بسيرفرلس للتصدير. وفقاً لما إذا تم تغيير الفرع، يقوم الوِركفلو بشرط تصدير إلى البيئة المناسبة.

إذا تم إرسال التغييرات إلى الفرع dev، يتم تصديرها إلى المرحلة dev. إذا تم إرسالها إلى الفرع الرئيسي، يتم تصديرها إلى المرحلة prod. يتم تنفيذ أوامر التصدير npx serverless deploy --stage dev أو npx serverless deploy --stage prod داخل دليل coffee-shop-api.

من أجل تصدير مؤمن، يتم الوصول الوِركفلو إلى معلومات اعتماد AWS ومفتاح Serverless من خلال المتغيرات البيئية الموجودة في GitHub Secrets. هذا يمكن السيف الخاص بالموجز CI/CD للتوثيق مع AWS وإطار Serverless Framework دون إعراض المعلومات الحساسة في المستودع.

الآن، يمكننا المضي قدماً لاختبار السيف.

الخطوة 5: اختبر سيفينات Dev و Prod.

ابتدأ بتأكد من أن الفرع الرئيسي (prod) يُدعى “main“. بعد ذلك قم بإنشاء فرع تطوير (dev) يُدعى “dev“. بمجرد إجراء أي تغييرات صالحة في فرع التطوير، قم بتسجيلها لتنشيط خط العمل GitHub Actions. سيؤدي هذا تلقائيا إلى نشر الموارد المحدثة إلى البيئة التطويرية. بمجرد التأكد من كل شيء في التطوير، يمكنك بعدها دمج فرع التطوير مع الفرع الرئيسي.

دمج التغييرات في الفرع الرئيسي يؤدي أيضًا تلقائيا إلى تنشيط خط الإنتاج للبيئة الإنتاجية. بهذه الطريقة، يتم تطبيق جميع التحديثات الضرورية وتنفيذ الموارد الإنتاجية بلا عيوب.

يمكنك مراقبة عملية النشر واستعراض سجلات التفاصيل لكل تشغيل GitHub Actions عن طريق التنقل إلى علامة Actions في مستودع GitHub الخاص بك.

تتيح السجلات الرؤية لكل خطوة من الأنابيب، مساعدتك على التأكد من أن كل شيء يعمل كما هو متوقع.

يمكنك اختيار أي تشغيل من الإنتاج لاستعراض السجلات التفاصيلية للبيئتين التطوير والإنتاج لتتبع التقدم والتأكد من أن كل شيء يتم بشكل سلس.

انتقل إلى تشغيل الإنتاج المحدد في GitHub Actions، كما هو مظهر في الصورة أدناه. هناك، يمكنك النظر في التفاصيل التنفيذية والنتائج لأي من الأنابيب التطوير أو الإنتاجية.

تأكد من إختبار كلا البيئتين التطوير والإنتاج بشكل جيد للتأكد من تنفيذ الأنابيب بنجاح.

خطوة 6: إختبر والتحقق من واجهات API الإنتاج والتطوير باستخدام Postman

وبمجرد تنفيذ وتكوين الAPIs والموارد ، يتوجب علينا إيجاد نقاط نهاية الAPI الفريدة (الURLs) التي تنتج عن AWS لبدء إجراء ال solicitudes للاختبار الوظيفي.

يمكن اختبار وظيفة الAPI ببساطة عن طريق 粘贴 هذه الURLs في المتصفح الإلكتروني. تجد الURLs في نتائج الخروج لتنفيذ تنشيطك الCI/CD.

للحصول عليها ، تتوجب عليك توجيه إلى تسجيلات أيام تشغيل GitHub Actions ، تحديد البناء الناجح الأحدث للبيئة والنقر على توزيعلمراجعة تفاصيل التوزيع لنقاط النهاية التي تم إنشاؤها.

قم بنقر على المرحلة توزيع إلى AWSللبيئة المختارة (Prod أو Dev) في تسجيلات أيام تشغيل GitHub Actions. حينها ، ستجد الURL المنتجة للAPI.

قم بنسخ وحفظ هذه الURL ، لأنها ستحتاج أثناء اختبار وظيفة API الخاص بك. هذه خريطة بوابتك لتأكد أن الAPI المتنفذ يعمل كما يتوجب وأنك تحصل بنجاح على بيانات من جدول DynamoDB.

حاليًا قم بنسخ إحدى URL الAPI المنتجة وألصقها في متصفحك. سترى مجموعة فارغة أو قائمة تظهر في الرد. هذا يؤكد في الواقع أن الAPI يعمل بشكل صحيح وأنك تحصل بنجاح على بيانات من جدول DynamoDB.

وعلى الرغم من أن القائمة فارغة ، يشير إليها أن الAPI قادر على الاتصال بالقاعدة البياناتية وإرجاع معلومات.

لتأكد من أن تعمل API الخاص بك عبر البيئتين المختلفتين ، قم بتكرار الخطوات لبي

لإجراء اختبار شامل أكثر، سنستخدم Postman لاختبار جميع طرق الواجهة البرمجية، Create, Read, Update و Delete ونقوم بهذه الاختبارات لكل من بيئتي التطوير والإنتاج.

لاختبار الطريقة GET، استخدم Postman لإرسال طلب GET إلى نقطة النهاية لواجهة البرمجة الحية باستخدام عنوان URL. ستتلقى نفس الاستجابة، وهي قائمة فارغة من طلبات القهوة كما هو موضح في أسفل الصورة أدناه. يؤكد ذلك قدرة واجهة البرمجة الحية على استرداد البيانات بنجاح، كما هو موضح في الصورة أدناه.

لإنشاء طلب فعلي، لنقم باختبار الطريقة POST. استخدم Postman مرة أخرى لإرسال طلب POST إلى نقطة النهاية لواجهة البرمجة الحية، وقدم اسم العميل وخلطة القهوة في هيكل الطلب كما هو موضح أدناه :

{
  "customer_name": "REXTECH",
  "coffee_blend": "Black"
}

سيكون الرد رسالة نجاح مع OrderId فريد للطلب الموضوع.

تحقق من أن الطلب الجديد تم حفظه في جدول DynamoDB عن طريق مراجعة العناصر في الجدول المحدد للبيئة :

لاختبار الطريقة PUT، قم بإرسال طلب PUT إلى نقطة النهاية لواجهة البرمجة الحية عن طريق تقديم معرف الطلب السابق وحالة طلب جديدة في هيكل الطلب كما هو موضح أدناه :

{                                                 
  "order_id": "42a81c27-1421-4025-9bef-72b14e723c34",
  "new_status": "Ready",                                             
  "customer_name": "REXTECH"                                             
}

سيكون الرد رسالة نجاح لتحديث الطلب مع OrderId للطلب الموضوع.

يمكنك أيضًا التحقق من تحديث حالة الطلب من عنصر جدول DynamoDB.

لاختبار الطريقة DELETE، باستخدام Postman، قم بإرسال طلب DELETE وتقديم معرف الطلب السابق واسم العميل في هيكل الطلب كما هو موضح أدناه:

{                                                 
  "order_id": "42a81c27-1421-4025-9bef-72b14e723c34",
  "customer_name": "REXTECH"
}

لقد تم حذف الطلب بنجاح، سيتم عرض رقم الطلب المنتهي.

مرة أخرى، يمكنك التحقق من أن الطلب قد تم حذفه في جدول DynamoDB.

الخاتمة

هذا هو كل شيء – مبارك! لقد أنجزت جميع الخطوات بنجاح. قمنا ببناء API راكد لا يحتاج لخادم يدعم وظائف CRUD (إنشاء، قراءة، تحديث، حذف) مع API Gateway و Lambda و DynamoDB وإطار Serverless و Node.js، وتوطين التحديثات الموافقة على التشغيل بواسطة Github Actions.

إذا وصلت إلى هنا، شكراً للقراءة! أتمنى أن يكون الأمر مفيداً بالنسبة لك.

إيفينيي أوتووني هو مهندس كلاود 6X مصرح من AWS موهوب في DevOps، الكتابة التقنية وخبرة التدريس التقني كمعلم تقني. يحركه رغبته في التعلم والتطوير ويشرف في بيئات التعاون. قبل التحول إلى الحوسبة السحابية، قضى ست سنوات كرياضي محترف في المضمار والحديقة.

في بداية 2022، قام بمهمة استراتيجية ليصبح مهندس الحوسبة السحابية/DevOps من خلال الدراسة الذاتية والانضمام إلى برنامج سحابي مسرّع 6 أشهر.

في مايو 2023، أنجز هذه الهدفة وحصل على أول وظيفة كمهندس الحوسبة السحابية، وحالياً قام بضم الهدف الشخصي الجديد لتمكين الأشخاص الآخرين في رحلتهم نحو السحابة.