تكامل Apache APISIX مع Azure Serverless

API7.ai

December 1, 2021

Ecosystem

تكامل Apache APISIX مع Azure Serverless

يوفر Apache APISIX دعمًا لأطر العمل الخالية من الخوادم (serverless) لمزودي السحابة الشهيرة (مع المزيد في الطريق). بدلاً من ترميز عنوان URL للوظيفة مباشرة في التطبيق، يقترح Apache APISIX تعريف مسار مع تمكين المكون الإضافي الخالي من الخوادم. وهذا يمنح المطورين المرونة لتحديث عنوان URI للوظيفة بشكل فوري مع تغيير مزود الخدمة الخالي من الخوادم إلى مزود سحابة مختلف دون أي عناء. أيضًا، يخفف هذا النهج من مخاوف التصريح والمصادقة من منطق التطبيق حيث أن Apache APISIX يدعم المصادقة القوية التي يمكن استخدامها لتحديد وتصريح العملاء للوصول إلى المسار المحدد مع الخدمة الخالية من الخوادم. تتحدث هذه المقالة عن الإضافة الأخيرة للمكون الإضافي الجديد azure-functions، وتقدم تعليمات مفصلة حول كيفية دمج Azure Functions، وهي حل خالي من الخوادم مستخدم على نطاق واسع، في مجموعة Apache APISIX الخالية من الخوادم.

كيف يعمل مكون azure-functions الإضافي

يسمح مكون azure-functions الإضافي للمستخدمين بتعريف مصدر علوي (upstream) لوظيفة Azure الخالية من الخوادم من نوع HTTP Trigger لعنوان URI للبوابة. إذا تم تمكينه، فإن هذا المكون الإضافي ينهي الطلب الجاري إلى ذلك العنوان URI المحدد ويبدأ طلبًا جديدًا إلى خدمة Azure الخالية من الخوادم (المصدر العلوي الجديد) نيابة عن العميل مع تفاصيل التصريح المناسبة التي يحددها المستخدمون، ورؤوس الطلب، وجسم الطلب، والمعلمات (يتم تمرير هذه المكونات الثلاثة من الطلب الأصلي) ويعيد جسم الاستجابة، ورمز الحالة، والرؤوس إلى العميل الأصلي الذي بدأ الطلب إلى وكيل Apache APISIX.

يدعم المكون الإضافي التصريح لخدمة Azure الخالية من الخوادم عبر مفاتيح API ودليل Azure النشط.

كيفية استخدام Azure Functions مع Apache APISIX

الهدف الرئيسي من المكون الإضافي هو توجيه مسار البوابة المحدد في تكوين المسار إلى عنوان URI لوظائف Azure. يقدم هذا القسم دليلًا عمليًا حول كيفية تكوين وإنشاء HTTP Trigger خالي من الخوادم على سحابة Azure.

  1. أولاً، قم بالتسجيل/الدخول إلى Microsoft Azure وقم بإعداد خطة تجريبية. وظائف Azure مجانية إلى الأبد حتى مليون استدعاء. لمعرفة المزيد عن التسعير، قم بزيارة هنا.

  2. قم بزيارة بوابة Azure (ملاحظة: يمكن الوصول إلى خدمات Azure عبر البوابة الإلكترونية، CLI وVSCode. للسهولة، نستخدم البوابة الإلكترونية).

    1. أولاً، قم بإنشاء مجموعة موارد لتقسيم خدمتك الخالية من الخوادم التي ستقوم بإنشائها منطقيًا. إنشاء مجموعة موارد
    2. قم بإنشاء تطبيق وظائف مع عنوان URL من اختيارك (سأختار test-apisix). إنشاء تطبيق وظائف
  3. قم بتثبيت امتداد Azure Functions في محرر VSCode. بعد التثبيت، قم بالمصادقة عبر الامتداد وقم بتثبيت أداة Azure Functions الأساسية للتطوير المحلي باستخدام:

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
    
  4. قم بنشر المقتطف التالي إلى نفس تطبيق الوظائف الذي أنشأناه للتو عبر لوحة امتداد Azure Functions في VSCode:

    module.exports = async function (context, req) {
      context.log("HTTP trigger invoked on Test-APISIX.");
    
      const name = req.query.name || (req.body && req.body.name);
      const responseMessage = name
        ? "Hello, " + name
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.";
    
      context.res = {
        // status: 200, /* Defaults to 200 */
        body: responseMessage,
      };
    };
    

يأخذ هذا المقتطف الاسم من معلمات الاستعلام (إذا كان موجودًا، وإلا من جسم الطلب) ويحيي المستخدم.

تفعيل مكون azure-functions الإضافي

التالي هو مثال حول كيفية تمكين مكون azure-functions الإضافي لمسار محدد. نفترض أن HTTP Trigger الخاص بك قد تم نشره وجاهز للخدمة.

# تمكين المكون الإضافي لمسار محدد
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "azure-functions": {
            "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
            "authorization": {
                "apikey": "<Generated API key to access the Azure-Function>"
            }
        }
    },
    "uri": "/azure"
}'

الآن، أي طلبات (HTTP/1.1، HTTPS، HTTP2) إلى عنوان URI /azure على بوابة Apache APISIX ستؤدي إلى استدعاء HTTP إلى عنوان URI الوظيفة المذكور وسيتم توجيه جسم الاستجابة مع رؤوس الاستجابة ورمز الاستجابة مرة أخرى إلى العميل. على سبيل المثال (هنا تأخذ وظيفة السحابة Azure معلمة الاستعلام name فقط وتعيد Hello $name):

curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2

Hello, Bisakh

بالنظر إلى أن Apache APISIX يعمل أيضًا مع enable_http2: true في config-default.yaml للبورت 9081 (على سبيل المثال)، فإن أي اتصال HTTP/2 بين العميل ووكيل APISIX سيتم توجيهه إلى خدمة Azure الخالية من الخوادم بشكل مشابه لـ HTTP/1.1 وسيتم توجيه الاستجابات مرة أخرى إلى العميل مع الرؤوس المناسبة. على سبيل المثال:

curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2

Hello, Bisakh

إيقاف مكون azure-functions الإضافي

الآن، لتعطيل المكون الإضافي، قم ببساطة بإزالة تكوين JSON المقابل في تكوين المكون الإضافي لتعطيل مكون azure-functions الإضافي وإضافة تكوين المصدر العلوي المناسب. يتم إعادة تحميل مكونات Apache APISIX بشكل فوري، لذلك ليست هناك حاجة لإعادة تشغيل Apache APISIX.

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/azure",
    "plugins": {},
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'

التكوين المخصص

في التكوين الأدنى أثناء إنشاء مسار جديد مع تمكين مكون azure-functions الإضافي، فإن function_uri هو السمة الإلزامية لتكوين المكون الإضافي التي تشير إلى عنوان URL للوظيفة. هناك العديد من الخيارات الإضافية التي يمكن تعديلها باستخدام مخطط المكون الإضافي ومخطط البيانات الوصفية.

مخطط المكون الإضافي

الاسمالنوعمطلوبالافتراضيصالحالوصف
function_uristringمطلوبn/an/aنقطة نهاية وظيفة Azure التي تطلق كود الوظيفة الخالية من الخوادم (مثال: http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectاختياريn/an/aبيانات الاعتماد للتصريح للوصول إلى وظيفة السحابة.
authorization.apikeystringاختياريn/an/aحقل داخل التصريح. مفتاح API الذي تم إنشاؤه للتصريح بالطلبات إلى تلك النقطة النهاية.
authorization.clientidstringاختياريn/an/aحقل داخل التصريح. معرف العميل (دليل Azure النشط) للتصريح بالطلبات إلى تلك النقطة النهاية.
timeoutintegerاختياري3000[100,...]مهلة طلب الوكيل بالمللي ثانية.
ssl_verifybooleanاختياريtruetrue/falseما إذا كان يتم تمكين التحقق من صحة SSL للخادم.
keepalivebooleanاختياريtruetrue/falseلإعادة استخدام نفس اتصال الوكيل في المستقبل القريب. اضبط على false لتعطيل keepalives وإغلاق الاتصال فورًا.
keepalive_poolintegerاختياري5[1,...]الحد الأقصى لعدد الاتصالات في المجموعة.
keepalive_timeoutintegerاختياري60000[1000,...]المهلة القصوى للاتصال الخامل (بالمللي ثانية).

هذا يعطي مرونة كبيرة لربط سلوك خدمة Azure الخالية من الخوادم - من تكوين المهلة إلى مجموعة keepalive والتحقق من صحة شهادة SSL للخدمة الخالية من الخوادم. بصراحة، هذا يعني الكثير عندما يتعلق الأمر بالخدمات الخالية من الخوادم حيث أن الخدمات تعتمد على الأحداث ويتم تخصيص الموارد من قبل مزود السحابة على الفور.

مخطط البيانات الوصفية

بالمثل، هناك بعض السمات التي يمكن تعديلها باستخدام البيانات الوصفية.

الاسمالنوعمطلوبالافتراضيصالحالوصف
master_apikeystringاختياري""n/aمفتاح API السري الذي يمكن استخدامه للوصول إلى عنوان URI لوظيفة Azure.
master_clientidstringاختياري""n/aمعرف العميل (الدليل النشط) الذي يمكن استخدامه للتصريح بعنوان URI الوظيفة.

توفر البيانات الوصفية لمكون azure-functions الإضافي وظيفة للتصريح الاحتياطي. تعرّف master_apikey و master_clientid (معرف عميل الدليل النشط لـ Azure) حيث يمكن للمستخدمين (اختياريًا) تعريف مفتاح API الرئيسي أو معرف العميل لنشر التطبيقات الحرجة. لذلك إذا لم يتم العثور على تفاصيل التصريح داخل سمة المكون الإضافي، يتم استخدام تفاصيل التصريح الموجودة في البيانات الوصفية.

ترتيب الأولوية النسبي هو كما يلي:

  • أولاً، يبحث المكون الإضافي عن مفاتيح x-functions-key أو x-functions-clientid داخل رأس الطلب إلى وكيل Apache APISIX.
  • إذا لم يتم العثور عليها، يتحقق مكون azure-functions الإضافي من تفاصيل التصريح داخل سمات المكون الإضافي. إذا كانت موجودة، فإنه يضيف الرأس المناسب إلى الطلب المرسل إلى وظيفة سحابة Azure.
  • إذا لم يتم العثور على تفاصيل التصريح داخل سمات المكون الإضافي، يقوم Apache APISIX بجلب تكوين البيانات الوصفية لهذا المكون الإضافي ويستخدم المفاتيح الرئيسية.

لإضافة مفتاح API رئيسي جديد، قم بإجراء طلب إلى نقطة النهاية /apisix/admin/plugin_metadata مع البيانات الوصفية المحدثة كما يلي:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "master_apikey" : "<Your azure master access key>"
}'

الخلاصة

مكون azure-functions الإضافي هو المكون الإضافي الثاني لـ Apache APISIX المصمم للخدمات الخالية من الخوادم. نحن نطور مكونات إضافية أخرى للخدمات الخالية من الخوادم وسنعرضها مع إصدارات Apache APISIX القادمة. إذا كنت مهتمًا، فلا تتردد في تقديم مشكلة لمشاركة آرائك. يمكنك أيضًا التحدث عن مقترحاتك لتطوير مكون إضافي جديد في قائمة البريد الخاصة بنا!

Tags: