Hello Cloud Run with Python (Streamlit)

1. مقدمة

96d07289bb51daa7.png

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

الهدف من هذا البرنامج التعليمي هو إنشاء تطبيق ويب Streamlit "Hello World" ونشره على Cloud Run.

أهداف الدورة التعليمية

  • كيفية إنشاء تطبيق "Hello World" باستخدام Streamlit
  • اختبار التطبيق من خلال تشغيل تطبيق Streamlit قبل نشره
  • حِزم البناء المستندة إلى السحابة الإلكترونية وكيفية عدم الحاجة إلى ملف Dockerfile عند توفّر streamlit في requirements.txt
  • كيفية نشر تطبيق Streamlit على 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.

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. كتابة الطلب

في هذه الخطوة، ستنشئ تطبيق Streamlit Python "Hello World" الذي يستجيب لطلبات HTTP.

دليل العمل

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

mkdir ~/helloworld-streamlit && cd ~/helloworld-streamlit

main.py

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

touch main.py

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

10af7b1a6240e9f4.gif

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

cloudshell edit main.py

main.py

import streamlit as st

st.title("Hello World! 👋🌎")
st.markdown(
    """
    This is a demo Streamlit app.

    Enter your name in the text box below and press a button to see some fun features in Streamlit.
    """
)

name = st.text_input("Enter your name:")

# Use columns to create buttons side by side
col1, col2 = st.columns(2)

with col1:
    if st.button("Send balloons! 🎈"):
        st.balloons()
        st.write(f"Time to celebrate {name}! 🥳")
        st.write("You deployed a Streamlit app! 👏")

with col2:
    if st.button("Send snow! ❄️"):
        st.snow()
        st.write(f"Let it snow {name}! 🌨️")
        st.write("You deployed a Streamlit app! 👏")

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

requirements.txt

أعِد فتح نافذة الوحدة الطرفية وأضِف ملفًا باسم requirements.txt لتحديد التبعيات:

touch requirements.txt

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

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/streamlit
streamlit==1.47.0

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

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

لاختبار التطبيق، استخدِم uv (مدير الحِزم والمشاريع السريع للغاية في Python) الذي يأتي مثبّتًا مسبقًا في Cloud Shell.

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

uv venv

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

uv pip install -r requirements.txt

ابدأ تشغيل التطبيق باستخدام streamlit run (مع إيقاف --server.enableCORS للاختبار لأنّه يتعارض مع Cloud Shell):

uv run streamlit run main.py --server.port=8080 --server.enableCORS=false

ستوضّح السجلات أنّ تطبيق Streamlit قيد التشغيل:

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8080
  Network URL: http://10.1.0.1:8080
  External URL: http://34.37.7.94:8080

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

6c9ff9e5c692c58e.gif

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

helloworld-streamlit-app.png

جرِّب ملء اسمك واختبار الزرّين الظاهرين على الشاشة.

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

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

6. النشر على Cloud Run

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

REGION=europe-west1

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

ls

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

main.py  requirements.txt

قبل النشر، أنشئ ملف .gcloudignore يتضمّن .venv/. يمنع هذا الأمر نشر Cloud Run من تضمين البيئة الافتراضية التي تم إنشاؤها من uv أثناء الاختبار المحلي.

أنشئ .gcloudignore باستخدام الأمر التالي:

echo ".venv/" > .gcloudignore

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

gcloud run deploy helloworld-streamlit \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • يؤدي الخيار --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-streamlit \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

يُفترض أن يظهر ما يلي:

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

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

helloworld-streamlit.gif

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

7. تَنظيم

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

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

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

لحذف خدمة Cloud Run، اتّبِع الخطوات التالية:

gcloud run services delete helloworld-streamlit \
  --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

لقد أنشأت تطبيق ويب "Hello World" باستخدام Streamlit ونشرته على Cloud Run.

المواضيع التي تناولناها

  • كيفية إنشاء تطبيق "Hello World" باستخدام Streamlit
  • اختبار التطبيق من خلال تشغيل تطبيق Streamlit قبل نشره
  • حِزم البناء المستندة إلى السحابة الإلكترونية وكيفية عدم الحاجة إلى ملف Dockerfile عند توفّر streamlit في requirements.txt
  • نشر تطبيق Streamlit على Cloud Run

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