التعامل مع الأخطاء في التطبيقات دون خوادم

باستخدام AWS Step Functions وAWS Lambda

في هذا البرنامج التعليمي، ستتعلم كيفية استخدام AWS Step Functions للتعامل مع أخطاء وقت تشغيل سير العمل. خدمة AWS Step Functions هي خدمة تنسيق دون خوادم تتيح لك تنسيق وظائف Lambda المتعددة بسهولة في عمليات سير عمل مرنة يسهل تصحيحها ويسهل تغييرها. خدمة AWS Lambda هي خدمة حوسبة تتيح تشغيل التعليمات البرمجية دون توفير الخوادم أو إدارتها. 

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

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

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

يتطلب هذا البرنامج التعليمي حساب AWS

لا توجد رسوم إضافية لـ AWS Step Functions أو AWS Lambda. تكون الموارد التي تقوم بإنشائها في هذا البرنامج التعليمي مؤهلة للطبقة المجانية. 

المزيد حول الطبقة المجانية >>


الخطوة 1. إنشاء وظيفة Lambda لمحاكاة واجهة برمجة تطبيقات

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


أ.  افتح وحدة الإدارة في AWS لتتمكن من إبقاء هذا الدليل التفصيلي مفتوحًا. عندما تقوم الشاشة بالتحميل، قم بإدخال اسم المستخدم وكلمة المرور لتبدأ. ثم اكتب Lambda في شريط البحث وحدِّد Lambda لفتح وحدة تحكم الخدمة.

( انقر للتكبير )


ب. اختر إنشاء وظيفة.

( انقر للتكبير )


جـ. اترك مؤلف من البداية محدَّدًا. ثم كوِّن وظيفة Lambda كما يلي:

في حقل الاسم، اكتب MockAPIFunction.
في حقل وقت التشغيل، اخترPython 3.6..
في حقل الدور، حدِّد إنشاء دور مخصص.

ستفتح نافذة IAM جديدة. اترك اسم الدور باسم lambda_basic_execution ثم انقر فوق السماح. ستتم إعادتك تلقائيًا إلى وحدة تحكم Lambda.

انقر فوق إنشاء وظيفة.

( انقر للتكبير )


د. في شاشة MockAPIFunction، مرر لأسفل حتى تصل إلى قسم التعليمات البرمجية للوظيفة. في هذا البرنامج التعليمي، ستقوم بإنشاء وظيفة تستخدم نموذج برمجة لتأليف وظائف Lambda في Python. في نافذة التعليمات البرمجية، استبدل كل التعليمات البرمجية بما يلي، ثم اختر حفظ.

class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass

def lambda_handler(event, context):
    statuscode = event["statuscode"]    
    if statuscode == "429":
        raise TooManyRequestsException('429 Too Many Requests')
    elif statuscode == "503":
        raise ServerUnavailableException('503 Server Unavailable')
    elif statuscode == "200":
        return '200 OK'
    else:
        raise UnknownException('Unknown error')

( انقر للتكبير )


هـ. بمجرد إنشاء وظيفة Lambda، مرر إلى أعلى النافذة ولاحظ Amazon Resource Name (ARN) في الزاوية العلوية اليمنى من الصفحة. تحدِّد Amazon Resource Names (ARN) موارد AWS بشكلٍ فريد، وتساعدك على تتبُّع واستخدام عناصر وسياسات AWS عبر خدمات AWS ومكالمات واجهة برمجة التطبيقات. نطلب ARN عندما تحتاج إلى الرجوع إلى مورد معين من Step Functions.

( انقر للتكبير )


الخطوة 2. إنشاء دورAWS Identity and Access Management (IAM)

يمكن لـ AWS Step Functions تنفيذ التعليمات البرمجية والوصول إلى موارد AWS الأخرى (على سبيل المثال، البيانات المخزنة في حاويات Amazon S3). للحفاظ على الأمان، يجب أن تمنح Step Functions الوصول إلى هذه الموارد باستخدام AWS Identity and Access Management (IAM).


أ. في نافذة متصفح أخرى، انتقل إلى وحدة الإدارة في AWS واكتب IAM في شريط البحث. انقر فوق IAM لفتح وحدة التحكم في الخدمة.

( انقر للتكبير )


ب. انقر فوق الأدوار، ثم اختر إنشاء دور.

( انقر للتكبير )


جـ. في صفحة تحديد نوع الكيان الموثوق به، ضمن خدمة AWS، حدِّد Step Functions من القائمة، ثم اختر التالي: الأذونات.

( انقر للتكبير )


د. في صفحة إرفاق سياسة الأذونات، اختر التالي: المراجعة.

 

( انقر للتكبير )


هـ. في صفحة المراجعة، اكتب step_functions_basic_execution في حقل اسم الدور وانقر فوق إنشاء دور.

( انقر للتكبير )


و. تم إنشاء دور IAM جديد ويظهر في القائمة أسفل IAM role لوظيفة Lambda.

( انقر للتكبير )


الخطوة 3. إنشاء جهاز حالات في Step Functions

الآن بعد أن أنشأت وظيفة Lambda البسيطة التي تحاكي استجابة واجهة برمجة التطبيقات، يمكنك إنشاء جهاز حالات في Step Functions للاتصال بواجهة برمجة التطبيقات ومعالجة الاستثناءات.

في هذه الخطوة، ستستخدم وحدة تحكم Step Functions لإنشاء جهاز حالات يستخدم حالة المهمة ذات حقل إعادة المحاولة والكشف للتعامل مع التعليمات البرمجية لاستجابات واجهة برمجة التطبيقات المختلفة. ستستخدم حالة المهمة لاستدعاء وظيفة محاكاة Lambda لواجهة برمجة التطبيقات، والتي ستعرض التعليمات البرمجية لحالة واجهة برمجة التطبيقات التي تدخلها في آلة الحالات.


أ. افتح وحدة تحكم AWS Step Functions. في صفحة إنشاء آلة الحالات، حدِّد مؤلف من البداية. في قسم التفاصيل، قم بتسمية آلة الحالات MyAPIStateMachine، ثم حدِّد سأستخدم دورًا موجودًا.

( انقر للتكبير )


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

استبدل محتويات قسم تعريف آلة الحالات بالتعليمات البرمجية التالية:

{
  "Comment": "An example of using retry and catch to handle API responses",
  "StartAt": "Call API",
  "States": {
    "Call API": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next" : "OK",
      "Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
      "Retry" : [ {
        "ErrorEquals": [ "TooManyRequestsException" ],
        "IntervalSeconds": 1,
        "MaxAttempts": 2
      } ],
      "Catch": [ 
        {
          "ErrorEquals": ["TooManyRequestsException"],
          "Next": "Wait and Try Later"
        }, {
          "ErrorEquals": ["ServerUnavailableException"],
          "Next": "Server Unavailable"
        }, {
          "ErrorEquals": ["States.ALL"],
          "Next": "Catch All"
        }
      ]
    },
    "Wait and Try Later": {
      "Type": "Wait",
      "Seconds" : 1,
      "Next" : "Change to 200"
    },
    "Server Unavailable": {
      "Type": "Fail",
      "Error":"ServerUnavailable",
      "Cause": "The server is currently unable to handle the request."
    },
    "Catch All": {
      "Type": "Fail",
      "Cause": "Unknown error!",
      "Error": "An error of unknown type occurred"
    },
    "Change to 200": {
      "Type": "Pass",
      "Result": {"statuscode" :"200"} ,
      "Next": "Call API"
    },
    "OK": {
      "Type": "Pass",
      "Result": "The request has succeeded.",
      "End": true
    }
  }
}

( انقر للتكبير )


جـ. ابحث عن سطر "الموارد" في حالة مهمة "استدعاء واجهة برمجة التطبيقات" (السطر 7). لتحديث ARN إلى ARN الخاص بوظيفة واجهة برمجة تطبيقات Lambda الوهمية التي أنشأتها للتو، انقر فوق نص ARN ثم حدِّد ARN من القائمة.

( انقر للتكبير )


د. انقر فوق زر التحديث الموجود بجانب مكان سير العمل المرئي ليقوم Step Functions بإنشاء رسم تخطيطي لآلة الحالات يتوافق مع سير العمل الذي صممته للتو. بعد مراجعة سير العمل المرئي، انقر فوق إنشاء آلة الحالات.

( انقر للتكبير )


الخطوة 4. اختبار سير عمل معالجة الأخطاء

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


أ. انقر بدء التنفيذ.

( انقر للتكبير )


ب. يظهر مربع حوار تنفيذ جديد، حيث يمكنك إدخال مدخل لآلة الحالات. ستؤدي دور واجهة برمجة التطبيقات، وستزود التعليمات البرمجية للخطأ الذي نريد أن تقدِّمه واجهة برمجة التطبيقات الوهمية. استبدل النص الموجود بالتعليمات البرمجية أدناه، ثم اختر بدء التنفيذ:

{
    "statuscode": "200"
}

( انقر للتكبير )


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

( انقر للتكبير )


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

يمكنك أن ترى أن حالة المهمة هذه قد استدعت وظيفة برمجة تطبيقات Lambda الوهمية لديك مع المدخلات التي قدمتها، والتقطها مخرج وظيفة Lambda هذه، "200 OK".

( انقر للتكبير )


هـ. بعد ذلك، انقر فوق حالة المهمة "موافق" في سير العمل المرئي. تحت تفاصيل الخطوة، يمكنك رؤية أن إخراج الخطوة السابقة (حالة استدعاء مهمة واجهة برمجة التطبيقات) قد مرَّ كمدخل لهذه الخطوة. حالة موافق هي حالة مرور، والتي تمرر مدخلاتها إلى مخرجاتها، ولا تؤدي أي عمل. حالات المرور مفيدة عند إنشاء أجهزة الحالات وإصلاح أخطائها.

( انقر للتكبير )


الخطوة 5. فحص تنفيذ آلة الحالات


أ. مرر إلى أعلى شاشة تفاصيل التنفيذ وانقر فوق MyAPIStateMachine.

( انقر للتكبير )


ب. انقر فوق بدء التنفيذمرة أخرى، وقم هذه المرة بتقديم المدخلات التالية ثم انقر فوق بدء التنفيذ.

{
    "statuscode": "503"
}

( انقر للتكبير )


جـ. في قسم سجل أحداث التنفيذ، قم بتوسيع كل خطوة تنفيذ للتأكد من أن سير عملك تصرف كما هو متوقع. توقعنا أن يفشل هذا التنفيذ، لذا لا تقلق! ستلاحظ الآتي:

  1. التقطت Step Functions مدخلاتك
  2. تم تمرير هذا الإدخال إلى حالة استدعاء مهمة واجهة برمجة التطبيقات
  3. استدعت حالة استدعاء مهمة واجهة برمجة التطبيقات وظيفة MockAPIFunction باستخدام هذا الإدخال
  4. تم تنفيذ وظيفة MockAPIFunction
  5. فشلت وظيفة MockAPIFunction مع ServerUnavailableException
  6. كشف بيان الكشف في حالة استدعاء مهمة واجهة برمجة التطبيقات عن هذا الاستثناء
  7. تسبب بيان الكشف في فشل سير العمل
  8. أكملت آلة الحالات تنفيذها

( انقر للتكبير )


د. بعد ذلك، ستقوم بمحاكاة استثناء 429. مرر إلى أعلى شاشة تفاصيل التنفيذ وانقر فوق MyAPIStateMachine. انقر فوق بدء التنفيذ، وقم بتقديم المدخلات التالية ثم انقر فوق بدء التنفيذ:

{
    "statuscode": "429"
}

( انقر للتكبير )


هـ. ستقوم الآن بفحص سلوك إعادة المحاولة لسير عملك. في قسم سجل أحداث التنفيذ، قم بتوسيع كل خطوة تنفيذ مرة أخرى للتأكد من أن Step Functions حاولت استدعاء وظيفة MockAPILambda مرتين أخريين، فشلت كلتاهما. في تلك المرحلة، انتقل سير عملك إلى حالة الانتظار والمحاولة لاحقًا (الموضحة في الصورة على اليمين)، على أمل أن تكون واجهة برمجة التطبيقات غير مستجيبة مؤقتًا.

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

( انقر للتكبير )


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

{
    "statuscode": "999"
}

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

( انقر للتكبير )


الخطوة 6. إنهاء مواردك

في هذه الخطوة، ستنهي الموارد ذات الصلة بـAWS Step Functions وAWS Lambda.

مهم:إنهاء الموارد التي لا ينشط استخدامها يؤدي إلى خفض التكاليف ويعد من أفضل الممارسات. يمكن أن يؤدي عدم إنهاء مواردك إلى فرض تكلفة.


أ. في الجزء العلوي من نافذة وحدة التحكم فيAWS Step Functions، انقر فوق أجهزة الحالات.

( انقر للتكبير )


ب. في نافذة أجهزة الحالات، انقر فوق MyAPIStateMachine وحدِّد حذف. قم بتأكيد الإجراء عن طريق تحديد حذف أجهزة الحالات في مربع الحوار. سيتم حذف أجهزة الحالات في غضون دقيقة أو دقيقتين بمجرد تأكيد Step Functions أن أيًا من عمليات تنفيذ العملية قد اكتملت.

( انقر للتكبير )


جـ. ثم ستقوم بحذف وظيفة Lambda. انقر فوق الخدمات في قائمة وحدة الإدارة في AWS، ثم حدِّد Lambda.

( انقر للتكبير )


د. في شاشة الوظائف، انقر فوق MockAPIFunction، وحدِّد الإجراءات، ثم حذف. قم بتأكيد الحذف بالنقر فوق حذف مرة أخرى.

( انقر للتكبير )


هـ. وأخيرًا، ستحذف IAM roles الخاصة بك. انقر فوق الخدمات في قائمة وحدة الإدارة في AWS، ثم حدِّد IAM.

( انقر للتكبير )


و. حدِّد كلاً من دوري IAM roles اللذين أنشأتهما لهذا البرنامج التعليمي، ثم انقر فوق حذف الدور. قم بتأكيد الحذف بالنقر فوق نعم، حذف في مربع الحوار.


يمكنك الآن تسجيل الخروج من وحدة الإدارة في AWS.

( انقر للتكبير )


تهانينا!

لقد استخدمت AWS Step Functions وAWS Lambda لإنشاء سير عمل لمعالجة الأخطاء لواجهة برمجة تطبيقات شبكة. باستخدام AWS Lambda، يمكنك تشغيل تعليمات برمجية لأي نوع من أنواع التطبيقات أو الخدمات الخلفية، وكل ذلك دون إدارة. كل ما عليك هو تحميل الرمز وتهتم Lambda بكل ما يلزم لتشغيل تعليماتك البرمجية وتوسيع نطاقها بتوافر كبير.

إن الجمع بين AWS Step Functions وAWS Lambda يجعل من السهل تنظيم AWS Lambda للتطبيقات دون خوادم. تسمح لك Step Functions بالتحكم في سير العمل المعقد باستخدام وظائف Lambda دون أن يقوم التطبيق الأساسي بإدارة الحالة وتنسيقها. يمكنك أيضًا استخدام Step Functions لتنسيق الخدمات المُصغَّرة باستخدام موارد الحوسبة، مثل Amazon EC2 وAmazon ECS.

تجربة برنامج تعليمي آخر

استكشف AWS Step Functions

تعمَّق في الوثائق


هل كان هذا البرنامج التعليمي مفيدًا؟