مرحبًا Cloud Run باستخدام Python

1. مقدمة

96d07289bb51daa7.png

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

الهدف من هذا البرنامج التعليمي هو إنشاء تطبيق ويب بسيط ونشره في Cloud Run.

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (الذي يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن يؤدي إكمال هذا الدرس التطبيقي حول الترميز إلى فرض أي تكاليف، إن وُجدت. لإيقاف تشغيل الموارد لتجنب تحمُّل الفواتير إلى ما هو أبعد من هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

بينما يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا البرنامج التعليمي Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

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

بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- تفعيل واجهات برمجة التطبيقات

من Cloud Shell، فعِّل واجهات برمجة التطبيقات Artifact Registry وCloud Build وCloud Run API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

وينتج عن ذلك رسالة نجاح مماثلة للرسالة التالية:

Operation "operations/..." finished successfully.

والآن، أنت على استعداد لبدء العمل وكتابة طلبك...

4. كتابة بيانات الطلب

في هذه الخطوة، ستُنشئ تطبيق Python بسيطًا يستند إلى Flask يستجيب لطلبات HTTP.

دليل العمل

يمكنك استخدام Cloud Shell لإنشاء دليل عمل باسم helloworld-python والتبديل إليه:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

إنشاء ملف باسم main.py:

touch main.py

عدِّل الملف باستخدام مُحرِّر سطر الأوامر المفضَّل لديك (nano أو vim أو emacs) أو من خلال النقر على زر Cloud Shell Editor:

10af7b1a6240e9f4.gif

لتعديل الملف مباشرةً باستخدام محرِّر Cloud Shell، استخدِم الأمر التالي:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

ينشئ هذا الرمز خدمة ويب أساسية تستجيب لطلبات HTTP GET برسالة ودية.

requirements.txt

أضِف ملفًا باسم requirements.txt لتحديد التبعيات:

touch requirements.txt

لتعديل الملف مباشرةً باستخدام محرِّر Cloud Shell، استخدِم الأمر التالي:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

ملف Procfile

وأخيرًا، أضِف ملفًا باسم Procfile لتحديد طريقة عرض التطبيق:

touch Procfile

لتعديل الملف مباشرةً باستخدام محرِّر Cloud Shell، استخدِم الأمر التالي:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

تأكَّد من توفّر جميع الملفات ضمن دليل العمل:

ls

يجب أن يسرد هذا الملفات التالية:

main.py  Procfile  requirements.txt

تطبيقك جاهز للنشر، ولكن لنختبره أولاً...

5- اختبار التطبيق

لاختبار التطبيق، أنشئ بيئة افتراضية:

virtualenv venv

تفعيل البيئة الافتراضية:

source venv/bin/activate

ثبِّت التبعيات:

pip install -r requirements.txt

يُفترض أن تصلك رسالة تأكيد كما يلي:

...
Successfully installed Flask ... gunicorn ...

ابدأ تشغيل التطبيق:

python main.py

تشير السجلات إلى أنك في وضع التطوير:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

في نافذة Cloud Shell، انقر على الرمز Web Preview واختَر Preview on port 8080:

6c9ff9e5c692c58e.gif

من المفترض أن يؤدي ذلك إلى فتح نافذة متصفّح تعرض الرسالة Hello World!.

يمكنك أيضًا فتح جلسة أخرى في Cloud Shell (علامة تبويب طرفية جديدة) من خلال النقر على رمز + وإرسال طلب ويب إلى التطبيق الذي يتم تشغيله على الجهاز:

curl localhost:8080

من المفترض أن تتلقى الإجابة التالية:

Hello World!

عند الانتهاء، ارجع إلى جلسة Cloud Shell الرئيسية وأوقِف الأمر python main.py باستخدام CTRL+C.

الخروج من البيئة الافتراضية:

deactivate

أخيرًا، أزِل دليل البيئة الافتراضية:

rm -r venv/

يعمل التطبيق على النحو المتوقع: لننشره...

6- النشر إلى التشغيل في السحابة الإلكترونية

يتميّز Cloud Run بأنّه إقليمي، ما يعني أنّ البنية الأساسية التي تدير خدمات Cloud Run تقع في منطقة محدّدة وتديرها Google لتكون متاحة بشكلٍ متكرّر في جميع المناطق ضمن تلك المنطقة. حدِّد المنطقة التي ستستخدمها في عملية النشر، مثل:

REGION="europe-west9"

تأكَّد من أنّك لا تزال في دليل العمل:

ls

يجب أن يسرد هذا الملفات التالية:

main.py  Procfile  requirements.txt

نشر التطبيق إلى تشغيل السحابة:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • يمكنك تحديد منطقة تلقائية باستخدام الأمر التالي: gcloud config set run/region $REGION.
  • يمكنك أيضًا إدارة Cloud Run تلقائيًا باستخدام الأمر التالي: gcloud config set run/platform managed
  • ويؤدي الخيار --allow-unauthenticated إلى جعل الخدمة متاحة للجميع. لتجنُّب الطلبات التي لم تتم مصادقتها، استخدِم --no-allow-unauthenticated بدلاً من ذلك.

في المرة الأولى، ستظهر لك رسالة تطلب منك إنشاء مستودع Artifact Registry. انقر على Enter للتحقّق من صحة ما يلي:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

سيؤدي ذلك إلى بدء تحميل رمز المصدر إلى مستودع Artifact Registry وإنشاء صورة الحاوية:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

وبعد ذلك، يُرجى الانتظار قليلاً حتى تكتمل عملية النشر. عند نجاح العملية، يعرض سطر الأوامر عنوان URL للخدمة:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

يمكنك الحصول على عنوان URL للخدمة باستخدام الأمر التالي:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

يُفترض أن يظهر هذا شيئًا مثل ما يلي:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

يمكنك الآن استخدام تطبيقك من خلال فتح عنوان URL للخدمة في متصفح ويب:

c836b93e5601e2cf.gif

يمكنك أيضًا استدعاء التطبيق من Cloud Shell:

curl $SERVICE_URL?who=me

يُفترَض أن تظهر لك رسالة الترحيب المتوقعة:

Hello me!

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

7. تَنظيم

على الرغم من أنّه لا يتم تحصيل رسوم من خلال Cloud Run عندما لا تكون الخدمة قيد الاستخدام، قد تُحصَّل رسوم منك مقابل تخزين صورة الحاوية في Artifact Registry. يمكنك حذف المستودع أو حذف مشروعك على Google Cloud لتجنُّب تحمُّل الرسوم. يؤدي حذف مشروعك على Google Cloud إلى إيقاف الفوترة لجميع الموارد المستخدمة في هذا المشروع.

لحذف مستودع صور الحاوية:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

لحذف خدمة Cloud Run:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

لحذف مشروعك على Google Cloud، يُرجى اتّباع الخطوات التالية:

  1. استرداد رقم تعريف مشروعك الحالي:
PROJECT_ID=$(gcloud config get-value core/project)
  1. تأكد من أن هذا هو المشروع الذي تريد حذفه:
echo $PROJECT_ID
  1. لحذف المشروع:
gcloud projects delete $PROJECT_ID

8. تهانينا!

96d07289bb51daa7.png

لقد أنشأت تطبيق ويب بسيطًا ونشرته في Cloud Run!

مزيد من المعلومات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.