Serverless REST API "على الركبة في 5 دقائق"

مرحبا يا هبر! نواصل اليوم المناقشة حول الفرص التي توفرها لنا Amazon Web Services وكيفية استخدام هذه الفرص في حل مشكلات التطبيق.

في مثال بسيط ، سنعمل على إنشاء واجهة REST API قابلة للتطوير التلقائي قابلة للتطوير التلقائي للخوادم في غضون بضع دقائق مع تحليل الحالة - الحصول على قائمة لمورد ما.

مثيرة للاهتمام؟ ثم انتقل تحت خفض!


(المصدر)

بدلا من الانضمام


لن نستخدم أي قواعد بيانات لتحليل المثال ؛ بدلاً من ذلك ، سيكون مصدر المعلومات الخاص بنا ملفًا نصيًا بسيطًا على AWS S3.

  • لذلك ، لنفترض أنه في AWS S3 لدينا ملف نصي برؤوس وبعض العمليات تكتب معلومات إليه.
  • سننشئ واجهة برمجة تطبيقات سحابية تُرجع استجابة JSON كطلب GET باستخدام المعلمة التي تم تمريرها.
  • في الوقت نفسه ، بناءً على تعقيد المهام ، ونتيجة لذلك ، المتطلبات المتزايدة لقدرة معالجة الموارد ، لا داعي للقلق بشأن ذلك ، لأن الخدمة قابلة للتطوير التلقائي بالكامل. وهذا يعني أنك لا تحتاج إلى أي إدارة وتخصيص خادم وإدارته ، ما عليك سوى تحميل الكود وتشغيله.

بنية النظام قيد التطوير




مكونات خدمات ويب أمازون المستخدمة:

  • Amazon S3 - تخزين الأشياء ، والذي يسمح لك بتخزين كميات غير محدودة تقريبًا من المعلومات ؛
  • AWS Identity and Access Management (IAM) - خدمة توفر القدرة على التحكم بشكل آمن في الوصول إلى خدمات وموارد AWS. باستخدام IAM ، يمكنك إنشاء وإدارة ومراقبة مستخدمي AWS ومجموعاتهم ، واستخدام أذونات لمنح أو منع الوصول إلى موارد AWS ؛
  • AWS Lambda - خدمة تتيح لك تشغيل التعليمات البرمجية دون التكرار وتكوين الخادم. يتم قياس كل قوة الحوسبة تلقائيًا لكل مكالمة. يتم فرض الرسوم بناءً على عدد طلبات الميزات ومدة خدمتها ، أي الوقت الذي يتم فيه تنفيذ التعليمات البرمجية.
    يتضمن مستوى الوصول المجاني (المستوى المجاني) مليون طلب شهريًا مجانًا و 400 كيلو بايت في الثانية. اللغات المدعومة: Node.js ، Java ، C # ، Go ، Python ، Ruby ، ​​PowerShell
    . سوف نستخدم بيثون:

    • مكتبة boto3 هي AWS SDK لـ Python والتي تسمح لك بالتفاعل مع خدمات Amazon المختلفة ؛
  • أما أمازون API Gateway ، فهي عبارة عن خدمة مطور تتم إدارتها بالكامل ، وهي مصممة لإنشاء ونشر وصيانة وصيانة ومراقبة وتأمين واجهات برمجة التطبيقات من جميع الأحجام. بالإضافة إلى القدرة على استخدام إصدارات متعددة من نفس واجهة برمجة التطبيقات (المراحل) للتصحيح ، والتنقيح والاختبار ، تتيح لك الخدمة إنشاء واجهات برمجة تطبيقات REST بدون خادم باستخدام AWS Lambda. تنفذ Lambda التعليمات البرمجية في بنية تحتية للحوسبة يمكن الوصول إليها بشكل كبير ، مما يلغي الحاجة إلى توزيع الخادم وتوسيع نطاقه وإدارته.
    يتضمن المستوى المجاني لـ HTTP / REST API مليون مكالمة من واجهة برمجة التطبيقات شهريًا لمدة 12 شهرًا

إعداد البيانات


سيتم استخدام ملف نصي يحتوي على علامة تبويب كمحدد حقل كمصدر للمعلومات لإنشاء استجابات لطلب GET REST. المعلومات الآن لا تهم حقًا في هذا المثال ، لكن من أجل الاستخدام الإضافي لواجهة برمجة التطبيقات ، قمت بتنزيل جدول تداول حالي في السندات المقومة بالروبل الروسي وحفظته في bonds.txt وقمت بوضع هذا الملف في مجموعة AWS S3 التي تم إنشاؤها خصيصًا من منصة التداول Quik.

مثال على المعلومات الواردة كما هو موضح في الشكل أدناه:



بعد ذلك ، تحتاج إلى كتابة وظيفة ستقوم بقراءة المعلومات من ملف bonds.txt وتحليلها وإصدارها عند الطلب. سوف AWS Lambda بخير مع هذا. لكن أولاً ، ستحتاج إلى إنشاء دور جديد سيتيح لدالة Lambda التي تم إنشاؤها قراءة المعلومات من المجموعة الموجودة في AWS S3.

إنشاء أدوار AWS لامدا


  1. في وحدة تحكم إدارة AWS ، انتقل إلى خدمة AWS IAM ثم إلى علامة التبويب "الأدوار" ، انقر فوق الزر "إنشاء دور" ؛

    إضافة دور جديد

  2. سيتم استخدام الدور الذي نقوم بإنشائه الآن بواسطة AWS Lambda لقراءة المعلومات من AWS S3. لذلك ، في الخطوة التالية ، حدد "تحديد نوع الموثوق" -> "خدمة Aws" و "اختر الخدمة التي ستستخدم هذا الدور" -> "Lambda" وانقر فوق الزر "التالي: أذونات"

    دور خدمة لامدا

  3. أنت الآن بحاجة إلى تعيين سياسات الوصول لموارد AWS التي سيتم استخدامها في الدور الذي تم إنشاؤه حديثًا. بسبب قائمة السياسات مثيرة للإعجاب ، باستخدام عامل التصفية للسياسات ، نشير إلى "S3" إليها. نتيجة لذلك ، حصلنا على قائمة تمت تصفيتها لخدمة S3. لاحظ مربع الاختيار المقابل لسياسة "AmazonS3ReadOnlyAccess" وانقر على زر "التالي: علامات".

    سياسات الأدوار

  4. الخطوة (إضافة علامات (اختياري)) اختيارية ، ولكن يمكنك تحديد علامات للأدوار إذا رغبت في ذلك. لن نقوم بذلك وننتقل إلى الخطوة التالية - معاينة. هنا تحتاج إلى تعيين اسم الدور - "ForLambdaS3-ReadOnly" ، أضف وصفًا وانقر على زر "إنشاء دور".

    أدوار العنوان


كل شيء ، تم إنشاء الدور ويمكننا استخدامه في عمل إضافي.

إنشاء ميزة جديدة في AWS Lambda


  1. انتقل إلى خدمة AWS Lambda وانقر على زر "إنشاء وظيفة":

    إنشاء وظيفة


    املأ جميع الحقول كما هو موضح في الصورة أدناه:

    • الاسم - "getAllBondsList" ؛
    • وقت التشغيل - "بيثون 3.6"
    • الدور - "اختيار دور حالي"
    • الدور الحالي - هنا نختار الدور الذي أنشأناه أعلاه - ForLambdaS3-ReadOnly

    اسم واختيار الدور

  2. يبقى فقط كتابة رمز الوظيفة والتحقق من أدائها في مختلف عمليات الاختبار. تجدر الإشارة إلى أن المكون الرئيسي لأي وظيفة Lambda (إذا كنت تستخدم Python) هو مكتبة boto3:

    import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('your-s3-bucket') obj = bucket.Object(key = 'bonds.txt') response = obj.get() 

    الفكرة الأساسية لوظيفة بايثون لدينا هي كما يلي:

    • افتح ملف bonds.txt ؛
    • قراءة رؤوس الأعمدة ؛
    • حطم السجلات حسب الصفحة (10 مجموعات في حالتنا) ؛
    • حدد الصفحة المطلوبة ؛
    • خريطة اسم الأعمدة والسجلات.
    • إعطاء النتيجة في شكل مجموعات.

    لن نخصص الكثير من الوقت لرمز الوظيفة نفسه والتنفيذ الفني ، كل شيء بسيط هنا ويتوفر الكود الكامل في GitHub .

      for i in range(0, len(lines_proc)): d = dict((u''.join(key), u''.join(value)) for (key, value) in zip(headers, lines_proc[i].split("\t"))) response_body.append(d) return { 'statusCode': 200, 'page' : num_page, 'body': response_body } 

    أدخل الكود (أو اكتب الكود :)) في كتلة "رمز الوظيفة" وانقر على زر "حفظ" في الركن الأيمن العلوي من الشاشة.

    إدراج رمز

  3. إنشاء أحداث الاختبار. بعد إدخال الرمز ، تكون الوظيفة متاحة للإطلاق والاختبار. انقر على زر "اختبار" وإنشاء بعض أحداث الاختبار: إطلاق وظيفة lambda_handler بمعلمات مختلفة. وهي:

    • بدء دالة باستخدام المعلمة 'page': '100'؛
    • تشغيل وظيفة باستخدام المعلمة 'page': '1000000'؛
    • بدء دالة باستخدام المعلمة 'page': 'bla-bla-bla'؛
    • تشغيل وظيفة بدون المعلمة "صفحة".

    اختبار الحدث Page100


    بدء تشغيل الوظيفة التي تم إنشاؤها من خلال إرسال صفحة حدث الاختبار == ​​100. كما يتبين من لقطة الشاشة أدناه ، نجحت الوظيفة في إرجاع الحالة 200 (OK) ، بالإضافة إلى مجموعة من المجموعات التي تتوافق مع الصفحة المائة من البيانات المقسمة باستخدام ترقيم الصفحات.

    بدء اختبار الحدث Page100


    لنقاء التجربة ، سنطلق حدث اختبار آخر - "PageBlaBlaBla". في هذه الحالة ، تقوم الدالة بإرجاع النتيجة مع الكود 415 وتعليق أنه من الضروري التحقق من صحة المعلمات التي تم تمريرها:

    اختبار الحدث PageBlaBlaBla


    الحدث PageBlaBlaBla أثار



إنشاء API


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

  • انتقل إلى خدمة AWS API Gateway. انقر فوق الزر "إنشاء واجهة برمجة التطبيقات" ، واضبط اسم واجهة برمجة التطبيقات - getAllBondsList

    إنشاء واجهة برمجة تطبيقات جديدة

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

    طريقة جديدة للحصول على


    بعد ذلك ، نشير إلى أن طريقة GET ستستخدم الدالة getAllBondsList الخاصة بـ Lambda. حدده وانقر على زر حفظ.

    امدا وظيفة ملزمة

  • دعنا ننشر واجهة برمجة التطبيقات ، وبالتالي الحصول على عنوان URL للاتصال بواجهة برمجة التطبيقات.
    انقر فوق إجراءات -> نشر واجهة برمجة التطبيقات ، ثم مرحلة النشر -> مرحلة جديدة
    من الممكن نشر واجهة برمجة التطبيقات (API) في مراحل مختلفة ويمكنك الاتصال بهذه المراحل كما تريد (على سبيل المثال ، DEV / QA / PROD). سنقوم بنشرها على الفور إلى PROD.
    نشر API


    بعد النشر ، سيكون هناك رابط لتشغيل API الذي تم إنشاؤه حديثًا. سننتقل إلى عنوان URL هذا في شريط عنوان المتصفح (أو نفّذ أمر curl في الجهاز الطرفي) - سنحصل على مكالمة واجهة برمجة التطبيقات ، ونتيجة لذلك ، سنشغل وظيفة Lambda:

    عنوان URL لواجهة برمجة التطبيقات


    سأستخدم تطبيق Postman لإظهار AWS API Gateway. في ذلك ، يمكنك تصحيح مريح واختبار تشغيل API.

    أول اختبار API
    انسخ عنوان URL من مرحلة PROD إلى ساعي البريد وإرسال طلب GET إلى واجهة برمجة التطبيقات لدينا:



    يبدو أن هناك شيئًا ما غير صحيح ... عرض طلب GET استجابة JSON بالكود 400 وتلميحًا بأن معلمة الصفحة لم يتم تعيينها في طلب استدعاء API. إضافة دعم لمعلمات الطلب إلى API.
  • دعم المعلمات التي تم تمريرها في الطلب.
    نعود إلى إعدادات طلب GET وانتقل إلى خطوة "طلب الطريقة".

    طلب الطريقة


    في الإعدادات التفصيلية لطلب الأسلوب ، تحتاج إلى توسيع كتلة معلمات سلسلة استعلام URL وإضافة معلمة جديدة "صفحة" وجعلها مطلوبة:

    إضافة معلمة


    نعود إلى صفحة تنفيذ الأسلوب وننتقل إلى طلب التكامل. نذهب إلى أسفل الصفحة ونفتح كتلة "قوالب التعيين". حدد "عندما لا توجد قوالب محددة (مستحسن)" ، في حقل نوع المحتوى ، حدد التطبيق / json وانقر على علامة الاختيار. نقوم بالتمرير لأسفل الصفحة أدناه وأدخل الرمز في مربع النص ، كما هو موضح في الصورة أدناه. بعد ذلك ، انقر فوق الزر "حفظ".

    طلب الطريقة


    بعد إجراء نشر واجهة برمجة التطبيقات مسبقًا ، نتحقق مرة أخرى ، ولكن مع مرور المعلمة "page":



    إنه نجاح! الآن تم تنفيذ الطلب بنجاح وأعاد إلينا المجموعات الموجودة في الصفحة العاشرة! الصيحة!
  • يبقى فقط حماية API الخاصة بنا من الهجمات غير المرغوب فيها من الخارج.

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

    انتقل إلى API Keys وقم بإنشاء مجموعة جديدة من مفاتيح API - KeyForBondsList.

    مفاتيح API


    بعد إنشاء مفتاح API بنجاح ، يجب عليك تحديد أن getAllBondsList API يجب أن تتطلب تمرير مفتاح API في رأس الطلب. وقم بربط KeyForBondsList محدد بـ getAllBondsList API.

    دعنا نرجع إلى إعدادات طلب GET في "طريقة الطلب" وقم بتغيير المعلمة المطلوبة من مفتاح API من false إلى true. الآن سيتطلب API نقل مفتاح API.

    مفتاح API مطلوب


    انتقل إلى خطة الاستخدام وإنشاء خطة جديدة لاستخدام API.

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

    وضع خطة الاستخدام


    انقر فوق "التالي" وانتقل إلى الصفحة التالية حيث تحتاج إلى توصيل مراحل API بخطة الاستخدام:

    ربط مرحلة بخطة الاستخدام


    في الصفحة التالية ، نربط مفاتيح API بخطة استخدام API. انقر فوق الزر "إضافة مفاتيح API إلى خطة الاستخدام" وابحث عن مفاتيح API التي تم إنشاؤها في الخطوات السابقة بالاسم:

    ربط مفاتيح API بخطة الاستخدام


    بعد إجراء النشر وتشغيل استدعاء GET لواجهة برمجة التطبيقات لدينا مرة أخرى ، نحصل على الجواب: "محظور" ، لأن يفتقد رأس الطلب إلى مفتاح API:



    دعونا نحاول إضافته عن طريق نسخ من API Keys -> KeyForBondsList -> مفتاح API -> إظهاره ولصقه في القسم المقابل من الطلب باستخدام المفتاح "x-api-key":



    كل شيء يعمل بها! هذه المرة ، يُرجع الطلب البيانات دون أي مشاكل ، وتكون مكالمة واجهة برمجة التطبيقات آمنة ومحمية من المتسللين بواسطة مفتاح API السري.

استنتاجات وملخص


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

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

نظرًا لبساطتها ورخصتها وقوتها النسبية ، تفتح خدمة بوابة AWS API فرصًا واسعة للمطورين لاستخدامها في العمل وفي المشروعات التجارية. لدمج المادة النظرية في هذه المقالة ، حاول التسجيل للحصول على اشتراك سنوي مجاني في Amazon Web Services وقم بتنفيذ الخطوات المذكورة أعلاه بنفسك لإنشاء واجهة برمجة تطبيقات REST.

لأية أسئلة واقتراحات ، أنا مستعد للتحدث بسرور. إنني أتطلع إلى تعليقاتكم على المقال وأتمنى لكم التوفيق!

Source: https://habr.com/ru/post/ar435180/


All Articles