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

1. مقدمة

96d07289bb51daa7.png

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

الهدف من هذا البرنامج التعليمي هو إنشاء تطبيق ويب بسيط ونشره على 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:

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

سيؤدي ذلك إلى عرض رسالة نجاح مشابهة لما يلي:

Operation "operations/..." finished successfully.

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

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

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

دليل العمل

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

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

main.py

أنشئ ملفًا باسم main.py:

touch main.py

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

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 هي خدمة إقليمية، ما يعني أنّ البنية الأساسية التي تشغّل خدمات Cloud Run تقع في منطقة معيّنة وتديرها Google لتكون متاحة بشكل متكرّر في جميع المناطق داخل تلك المنطقة. حدِّد المنطقة التي ستستخدمها للنشر، على سبيل المثال:

REGION="europe-west9"

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

ls

يجب أن تتضمّن هذه القائمة الملفات التالية:

main.py  Procfile  requirements.txt

انشر التطبيق على Cloud Run:

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. انقر على "إدخال" للتحقّق من صحة الرمز:

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 نطاق صورة الحاوية تلقائيًا وأفقيًا للتعامل مع الطلبات المستلَمة، ثم تقلّل نطاقها عند انخفاض الطلب. لن تدفع إلا مقابل وحدة المعالجة المركزية والذاكرة والشبكة المستخدَمة أثناء معالجة الطلب.

7. تَنظيم

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

لحذف مستودع صور الحاويات، اتّبِع الخطوات التالية:

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 Generic License.