1. مقدمة
يمكنك استخدام سير العمل لإنشاء مهام سير عمل بدون خادم تربط سلسلة من المهام بدون خادم معًا بالترتيب الذي تحدِّده. يمكنك الجمع بين قوة واجهات برمجة التطبيقات في Google Cloud، والمنتجات بدون خادم، مثل Cloud Functions وCloud Run، والاتصال بواجهات برمجة التطبيقات الخارجية لإنشاء تطبيقات مرنة بدون خوادم.
لا تتطلّب سير العمل أي إدارة للبنية الأساسية، وتتوسّع بسلاسة مع الطلب، بما في ذلك تقليص الوقت إلى الصفر. من خلال نموذج تسعير الدفع لكل استخدام، لن تدفع إلا مقابل مدة التنفيذ.
في هذا الدرس التطبيقي حول الترميز، ستتعلم كيفية ربط خدمات Google Cloud المتعددة وواجهات برمجة تطبيقات HTTP الخارجية بـ Workflows. وبشكل أكثر تحديدًا، سيتم ربط خدمتَين عامتَين من خدمتَي Cloud Functions، وهما خدمة خاصة في Cloud Run وواجهة برمجة تطبيقات HTTP عامة خارجية ضِمن سير العمل.
ما ستتعرَّف عليه
- أساسيات سير العمل.
- كيفية ربط دوال السحابة الإلكترونية العامة بمنصة Workflows
- كيفية ربط خدمات Cloud Run الخاصة بخدمة Workflows
- كيفية اتصال واجهات برمجة تطبيقات HTTP الخارجية باستخدام Workflows
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
بدء Cloud Shell
مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.
من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا التمرين من خلال متصفح.
3- نظرة عامة على سير العمل
الأساسيات
يتكون سير العمل من سلسلة من الخطوات الموضحة باستخدام بناء الجملة المستند إلى YAML في سير العمل. هذا هو تعريف سير العمل. للحصول على شرح تفصيلي حول بنية YAML لسير العمل، يُرجى الاطّلاع على صفحة مرجع البنية.
عند إنشاء سير عمل، يتم نشره، ما يجعله جاهزًا للتنفيذ. التنفيذ هو عملية تشغيل واحدة للمنطق المضمّن في تعريف سير العمل. جميع عمليات تنفيذ سير العمل مستقلة ويدعم المنتج عددًا كبيرًا من عمليات التنفيذ المتزامنة.
تفعيل الخدمات
في هذا الدرس التطبيقي حول الترميز، ستربط دوال Cloud Functions وخدمات Cloud Run بمنصة Workflows. ستستخدم أيضًا Cloud Build وCloud Storage أثناء إنشاء الخدمات.
تفعيل جميع الخدمات اللازمة:
gcloud services enable \ cloudfunctions.googleapis.com \ run.googleapis.com \ workflows.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com
في الخطوة التالية، عليك ربط وظيفتَي السحابة الإلكترونية معًا في سير عمل.
4. نشر أول دالة في السحابة الإلكترونية
الدالة الأولى هي منشئ أرقام عشوائية في بايثون.
أنشئ دليلًا وانتقل إليه لرمز الدالة:
mkdir ~/randomgen cd ~/randomgen
أنشئ ملف main.py
في الدليل يتضمّن المحتوى التالي:
import random, json from flask import jsonify def randomgen(request): randomNum = random.randint(1,100) output = {"random":randomNum} return jsonify(output)
عندما تتلقّى هذه الدالة طلب HTTP، تنشئ هذه الدالة رقمًا عشوائيًا بين 1 و100 وتُرجع بتنسيق JSON إلى المتصل.
تعتمد الدالة على Flask لمعالجة HTTP، ويجب إضافة ذلك كتبعية. تتم إدارة التبعيات في بايثون باستخدام pip ويتم التعبير عنها في ملف بيانات وصفية باسم requirements.txt
.
أنشئ ملف requirements.txt
في الدليل نفسه ويتضمّن المحتوى التالي:
flask>=1.0.2
انشر الدالة باستخدام مشغّل HTTP مع السماح بطلبات لم تتم مصادقتها باستخدام هذا الأمر:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
بعد نشر الدالة، يمكنك الاطّلاع على عنوان URL الخاص بالدالة ضمن السمة httpsTrigger.url
، وهو معروض في وحدة التحكّم أو معروضًا مع الأمر gcloud functions describe
.
يمكنك أيضًا الانتقال إلى عنوان URL للدالة باستخدام الأمر curl
التالي:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
الدالة جاهزة لسير العمل.
5- نشر وظيفة السحابة الإلكترونية الثانية
الدالة الثانية هي المضاعف. تضرب المدخلات المستلمة في 2.
أنشئ دليلًا وانتقل إليه لرمز الدالة:
mkdir ~/multiply cd ~/multiply
أنشئ ملف main.py
في الدليل يتضمّن المحتوى التالي:
import random, json from flask import jsonify def multiply(request): request_json = request.get_json() output = {"multiplied":2*request_json['input']} return jsonify(output)
وعند تلقّي طلب HTTP، تستخرج هذه الدالة input
من نص JSON، وتضربه في 2 وتعرضه بتنسيق JSON مرة أخرى إلى المتصل.
أنشئ ملف requirements.txt
نفسه في الدليل نفسه ويتضمّن المحتوى التالي:
flask>=1.0.2
انشر الدالة باستخدام مشغّل HTTP مع السماح بطلبات لم تتم مصادقتها باستخدام هذا الأمر:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
بعد نشر الدالة، يمكنك أيضًا الانتقال إلى عنوان URL الخاص بالدالة باستخدام الأمر curl
التالي:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
الدالة جاهزة لسير العمل.
6- الربط بوظيفتَي السحابة الإلكترونية
في سير العمل الأول، قم بربط الدالتين معًا.
أنشئ ملف workflow.yaml
يتضمّن المحتوى التالي.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - returnResult: return: ${multiplyResult}
في سير العمل هذا، تحصل على رقم عشوائي من الدالة الأولى وتمرره إلى الدالة الثانية. والناتج هو العدد العشوائي الضرب.
نشر سير العمل الأول:
gcloud workflows deploy workflow --source=workflow.yaml
تنفيذ سير العمل الأول:
gcloud workflows execute workflow
بعد تنفيذ سير العمل، يمكنك الاطّلاع على النتيجة من خلال إدخال رقم تعريف التنفيذ الذي تم تقديمه في الخطوة السابقة:
gcloud workflows executions describe <your-execution-id> --workflow workflow
ستتضمّن النتائج result
وstate
:
result: '{"body":{"multiplied":108},"code":200 ... } ... state: SUCCEEDED
7. ربط واجهة برمجة تطبيقات HTTP خارجية
بعد ذلك، عليك ربط math.js كخدمة خارجية في سير العمل.
في math.js، يمكنك تقييم التعبيرات الحسابية مثل هذا:
curl https://api.mathjs.org/v4/?'expr=log(56)'
وفي هذه المرة، سيتم استخدام Cloud Console لتعديل سير العمل. البحث عن "Workflows
" في Google Cloud Console:
ابحث عن سير العمل وانقر على علامة التبويب Definition
:
تعديل تعريف سير العمل وتضمين طلب إلى math.js
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - returnResult: return: ${logResult}
يُرسل سير العمل الآن ناتج دالة الضرب في استدعاء دالة السجلّ في math.js
.
سترشدك واجهة المستخدم لتعديل سير العمل ونشره. بعد نشر التطبيق، انقر على Execute
لتنفيذ سير العمل. ستظهر تفاصيل عملية التنفيذ:
لاحظ رمز الحالة 200
وbody
مع ناتج دالة السجل.
رائع جدًا لقد دمجت خدمة خارجية في سير العمل لدينا.
8. نشر خدمة Cloud Run
في الجزء الأخير، يمكنك إنهاء سير العمل من خلال الاتصال بخدمة خاصة على السحابة الإلكترونية. وهذا يعني أنه يجب مصادقة سير العمل للاتصال بخدمة تشغيل السحابة الإلكترونية.
تعرض خدمة تشغيل السحابة الإلكترونية math.floor
للرقم الذي تم تمريره.
أنشئ دليلاً لرمز الخدمة وانتقِل إليه:
mkdir ~/floor cd ~/floor
أنشئ ملف app.py
في الدليل يتضمّن المحتوى التالي:
import json import logging import os import math from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['POST']) def handle_post(): content = json.loads(request.data) input = float(content['input']) return f"{math.floor(input)}", 200 if __name__ != '__main__': # Redirect Flask logs to Gunicorn logs gunicorn_logger = logging.getLogger('gunicorn.error') app.logger.handlers = gunicorn_logger.handlers app.logger.setLevel(gunicorn_logger.level) app.logger.info('Service started...') else: app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
ينشر Cloud Run حاويات، لذا تحتاج إلى Dockerfile
ويجب ربط الحاوية بمتغيّر بيئة 0.0.0.0
وPORT
، وبالتالي يكون الرمز أعلاه.
عندما تتلقّى هذه الدالة طلب HTTP، تستخرج هذه الدالة input
من نص JSON، وتستدعي Mat.floor وترجع النتيجة إلى المتصل.
في الدليل نفسه، أنشئ Dockerfile
التالي:
# Use an official lightweight Python image. # https://hub.docker.com/_/python FROM python:3.7-slim # Install production dependencies. RUN pip install Flask gunicorn # Copy local code to the container image. WORKDIR /app COPY . . # Run the web service on container startup. Here we use the gunicorn # webserver, with one worker process and 8 threads. # For environments with multiple CPU cores, increase the number of workers # to be equal to the cores available. CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app
إنشاء الحاوية:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
وبعد إنشاء الحاوية، يمكنك نشره على Cloud Run. لاحِظ علامة no-allow-unauthenticated
. يضمن ذلك أن الخدمة لا تقبل سوى المكالمات التي تمت مصادقتها:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --platform managed \ --no-allow-unauthenticated
بعد نشر الخدمة، تصبح جاهزة لسير العمل.
9. ربط خدمة Cloud Run
قبل أن تتمكن من تهيئة سير العمل لاستدعاء خدمة Cloud Run الخاصة، يجب إنشاء حساب خدمة لكي تستخدمه خدمة Workflows:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
امنح الدور "run.invoker
" لحساب الخدمة. سيتيح ذلك لحساب الخدمة الاتصال بخدمات Cloud Run التي تمت مصادقتها:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role "roles/run.invoker"
تعديل تعريف سير العمل في workflow.yaml
لتضمين خدمة Cloud Run لاحظ كيف يتم تضمين الحقل auth
أيضًا للتأكد من تمرير سير العمل في الرمز المميز للمصادقة في عمليات الاستدعاء إلى خدمة تشغيل السحابة الإلكترونية:
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - floorFunction: call: http.post args: url: https://floor-<random-hash>.run.app auth: type: OIDC body: input: ${logResult.body} result: floorResult - returnResult: return: ${floorResult}
تعديل سير العمل مرور هذه الوقت في حساب الخدمة:
gcloud workflows deploy workflow \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
تنفيذ سير العمل:
gcloud workflows execute workflow
ويمكنك خلال بضع ثوانٍ إلقاء نظرة على عملية تنفيذ سير العمل لمعرفة النتيجة:
gcloud workflows executions describe <your-execution-id> --workflow workflow
وسيتضمّن الناتج عددًا صحيحًا result
وstate
:
result: '{"body":"5","code":200 ... } ... state: SUCCEEDED
10. تهانينا
تهانينا على إكمال الدرس التطبيقي حول الترميز.
النقاط التي تناولناها
- أساسيات سير العمل.
- كيفية ربط دوال السحابة الإلكترونية العامة بمنصة Workflows
- كيفية ربط خدمات Cloud Run الخاصة بخدمة Workflows
- كيفية اتصال واجهات برمجة تطبيقات HTTP الخارجية باستخدام Workflows