1. מבוא
Cloud Run היא פלטפורמת מחשוב מנוהלת שמאפשרת להריץ קונטיינרים ללא שמירת מצב שאפשר להפעיל באמצעות בקשות HTTP. הוא מבוסס על פרויקט הקוד הפתוח Knative, שמאפשר ניידות של עומסי העבודה בין פלטפורמות. Cloud Run הוא שירות ללא שרת: הוא מסתיר את כל ניהול התשתית, כך שאתם יכולים להתמקד במה שהכי חשוב – בניית אפליקציות מעולות.
במדריך הזה נסביר איך ליצור אפליקציית אינטרנט של Streamlit עם הטקסט Hello World ולפרוס אותה ב-Cloud Run.
מה תלמדו
- איך יוצרים אפליקציית Streamlit 'Hello World'.
- בדיקת האפליקציה על ידי הפעלת אפליקציית Streamlit לפני הפריסה.
- חבילות Cloud Buildpack ואיך הנוכחות של
streamlit
ב-requirements.txt
מאפשרת שלא יהיה צורך ב-Dockerfile. - איך פורסים אפליקציית Streamlit ב-Cloud Run.
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים ל-Google Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, אתם צריכים ליצור חשבון.
- שם הפרויקט הוא השם המוצג למשתתפים בפרויקט. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך לדעת מה היא. ברוב המדריכים לתכנות תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-
PROJECT_ID
). אם לא אהבתם את המזהה שנוצר, תוכלו ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא נשארת לאורך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
הפעלת Cloud Shell
אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל במדריך הזה נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת בענן.
הפעלת Cloud Shell
- ב-Cloud Console, לוחצים על Activate Cloud Shell.
אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים עם תיאור של השירות. אם הוצג לכם מסך ביניים, לחצו על המשך.
הקצאת המשאבים וחיבור ל-Cloud Shell נמשכים רק כמה רגעים.
במכונה הווירטואלית הזו טעונים כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן.
אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות והפרויקט אמור להיות מוגדר לפי מזהה הפרויקט.
- מריצים את הפקודה הבאה ב-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`
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט שלכם:
gcloud config list project
פלט הפקודה
[core] project = <PROJECT_ID>
אם הוא לא מוגדר, אפשר להגדיר אותו באמצעות הפקודה הבאה:
gcloud config set project <PROJECT_ID>
פלט הפקודה
Updated property [core/project].
3. הפעלת ממשקי ה-API
מ-Cloud Shell, מפעילים את ממשקי ה-API של 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 Editor:
כדי לערוך את הקובץ ישירות באמצעות Cloud Shell Editor, משתמשים בפקודה הזו:
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 Editor, משתמשים בפקודה הזו:
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
:
ייפתח חלון בדפדפן שבו מוצגת הכותרת Hello World! 👋🌎
.
נסו להזין את השם שלכם ולבדוק את שני הלחצנים במסך.
כשמסיימים, חוזרים לסשן הראשי של 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 של השירות בדפדפן אינטרנט:
מעולה! הרגע פרסתם אפליקציה ב-Cloud Run. Cloud Run מבצע התאמה אוטומטית לעומס (autoscaling) של קובץ האימג' בקונטיינר באופן אופקי כדי לטפל בבקשות שהתקבלו, ואז מצמצם את מספר הקונטיינרים כשהביקוש יורד. משלמים רק על השימוש ב-CPU, בזיכרון ובחיבור לרשת במהלך הטיפול בבקשות בשירות הזה של Cloud Run.
7. הסרת המשאבים
ב-Cloud Run לא מחויבים כשלא משתמשים בשירות, אבל יכול להיות שתחויבו על אחסון קובץ האימג' של הקונטיינר ב-Artifact Registry. כדי להימנע מחיובים, אפשר למחוק את המאגר או את פרויקט Cloud. כשמוחקים פרויקט ב-Cloud, החיוב על כל המשאבים שנעשה בהם שימוש באותו פרויקט נפסק.
כדי למחוק את מאגר התמונות של הקונטיינר:
gcloud artifacts repositories delete cloud-run-source-deploy \
--location $REGION
כדי למחוק את שירות Cloud Run:
gcloud run services delete helloworld-streamlit \
--region $REGION
כדי למחוק את הפרויקט ב-Google Cloud,
- מאחזרים את מזהה הפרויקט הנוכחי:
PROJECT_ID=$(gcloud config get-value core/project)
- חשוב לוודא שזה הפרויקט שרוצים למחוק:
echo $PROJECT_ID
- מחיקת הפרויקט:
gcloud projects delete $PROJECT_ID
8. מעולה!
יצרתם אפליקציית אינטרנט של Streamlit עם הטקסט Hello World ופרסתם אותה ב-Cloud Run.
מה נכלל
- איך יוצרים אפליקציית Streamlit 'Hello World'.
- בדיקת האפליקציה על ידי הפעלת אפליקציית Streamlit לפני הפריסה.
- חבילות Cloud Buildpack ואיך הנוכחות של
streamlit
ב-requirements.txt
מאפשרת שלא יהיה צורך ב-Dockerfile. - פריסת אפליקציית Streamlit ב-Cloud Run.
מידע נוסף
- מסמכי העזרה של Cloud Run
- כדי לראות עוד אפשרויות, אפשר לעיין במאמר Dev to Prod in Three Easy Steps with Cloud Run (פיתוח עד לייצור בשלושה שלבים פשוטים באמצעות Cloud Run).
- כדי ליצור מסד נתונים של Cloud SQL, לנהל פרטי כניסה באמצעות Secret Manager ולפרוס את Django, צריך להשלים את המדריך Django ב-Cloud Run.
- כדאי לעיין בהדרכות נוספות של Codelab בנושא Cloud Run…