1. סקירה כללית
בשיעור ה-Lab הזה תלמדו ליצור משימה ב-Cloud Run ולהגדיר משימה ב-Cloud Scheduler. תפרסו את שירות התפריט של Cymbal Eats באמצעות סקריפט ההגדרה. תיצורו משימה ב-Cloud Run שתבצע קריאות API לשירות התפריט של Cymbal Eats. מריצים את המשימה באמצעות Google Cloud CLI ומגדירים לה לוח זמנים. כדי לאמת את הביצוע, בודקים את היומנים ומבצעים קריאות API לשירות התפריט כדי לוודא שפריטי התפריט נמחקו.
מהן משימות ב-Cloud Run?
משימה ב-Cloud Run מפעילה קונטיינר שלא משמש להצגת בקשות אינטרנט, אלא לביצוע משימות תפעוליות או עיבוד נתונים. הקונטיינר ירוץ את המשימה ויצא בסיום.
משימה של שירות ניקוי
משימה השירות של ניקוי תשחזר את הפריטים בתפריט בסטטוס 'נכשל' ותמחוק אותם. כשנוצרים פריטים חדשים בתפריט, המערכת מנתחת את התמונות באמצעות Vision API כדי לזהות אם מדובר בפריט מזון או לא. אם התמונות לא יעמדו באימות הזה, סטטוס הפריטים בתפריט יעודכן ל'נכשל' ולאחר מכן הם יימחקו על ידי משימת הניקוי.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- יצירת משימות ב-Cloud Run
- הפעלת משימות ב-Cloud Run
- יצירת משימות ב-Cloud Scheduler
- אימות ביצוע המשימות
דרישות מוקדמות
- בשיעור ה-Lab הזה נדרש ידע בסיסי במסוף Cloud ובסביבות מעטפת.
- ניסיון קודם ב-Cloud Run וב-Cloud Scheduler יעזור לכם, אבל הוא לא חובה.
2. הגדרה ודרישות
הגדרת פרויקט ב-Cloud
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או משתמשים מחדש בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט. זוהי מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שמגדירים אותו. מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא משנה מה המחרוזת הזו. ברוב ה-codelabs תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מזוהה בתור
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניכם, תוכלו ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות שם משלכם ולבדוק אם הוא זמין. לא ניתן לשנות את השם אחרי השלב הזה, והוא יישאר למשך כל תקופת הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי העזרה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או ב-API של Cloud. השלמת הקודלאב הזה לא אמורה לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים אחרי סיום המדריך, אפשר למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בסך 300$.
הגדרת הסביבה
לוחצים על הסמל שמשמאל לסרגל החיפוש כדי להפעיל את Cloud Shell.
ב-Cloud Shell, מריצים את הפקודה הבאה כדי לשכפל את קוד האפליקציה מהמאגר הזה ולעבור לספרייה שמכילה את שירות התפריט:
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
פורסים את שירות Menu באמצעות סקריפט ההגדרה ב-Cloud Run. שירות התפריט הוא מיקרו-שירות מבוסס-Java שנוצר באמצעות מסגרת Quarkus, תוך שימוש במסד הנתונים Cloud SQL Postgres לקצה העורפי. שירות Menu הוא יחסי תלות בסביבת זמן הריצה של המשימה ב-Cloud Run שתיצרו בשלבים הבאים.
./setup.sh
יצירת כל הרכיבים הנדרשים תיקח כ-10 דקות.
ממשיכים בשלבים הבאים אחרי שמריצים את הפקודה שלמעלה.
3. הצגת הקוד של משימה ב-Cloud Run
לוחצים על סמל הפלוס כדי לפתוח כרטיסייה חדשה ב-Cloud Shell.
עוברים לספרייה שמכילה את שירות הניקוי ובודקים את הקבצים שמרכיבים את המשימה:
cd ~/cymbal-eats/cleanup-service
הקובץ cleanup-service בספרייה הזו מכיל קובץ Dockerfile
שמגדיר את קובץ האימג' בקונטיינר של המשימה של שירות הניקוי, עם יחסי התלות הנדרשים(httpie, jq).
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]
סקריפט הניקוי בפועל, שמופיע בהמשך, מכיל פקודות לקבלת רשימה של פריטי תפריט בסטטוס 'נכשל' ולמחיקה שלהם באמצעות קריאות API לשירות התפריט.
script.sh
echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
http GET $MENU_SERVICE_URL/menu/$id
http DELETE $MENU_SERVICE_URL/menu/$id
done
# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
http GET $MENU_SERVICE_URL/menu/$id
http DELETE $MENU_SERVICE_URL/menu/$id
done
שימו לב לנקודות הבאות לגבי הסקריפט:
- משתני הסביבה
FAILED_ITEM_AGE
ו-MENU_SERVICE_URL
יוגדרו במהלך הפריסה ויועברו על ידי המשימה ב-Cloud Run. FAILED_ITEM_AGE
– מספר הדקות לפני שהפריט שנכשל יימחק.MENU_SERVICE_URL
– כתובת ה-URL של שירות התפריט של Cymbal Eats.
4. יצירת משימה ב-Cloud Run
בשלב הבא תיצורו קובץ אימג' בקונטיינר ותפרסמו אותו ב-Artifact Registry.
קובץ האימג' בקונטיינר ישמש ליצירת משימה ב-Cloud Run.
מפעילים את ממשקי ה-API של השירותים:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudscheduler.googleapis.com \
--quiet
מגדירים את משתני הסביבה:
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service
יוצרים מאגר חדש ב-Artifact Registry לאחסון קובצי אימג' של Docker למשימות ניקוי:
gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION
יוצרים קובץ אימג' בקונטיינר באמצעות Cloud Build ומעבירים אותו בדחיפה ל-Artifact Registry באמצעות פקודה אחת:
gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest
פלט לדוגמה:
DURATION: 35S SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more) STATUS: SUCCESS
אחרי שהפרסום מסתיים, עוברים אל Artifact Registry ובודקים את התמונה שפורסמה:
חוזרים לכרטיסייה השנייה ב-Cloud Shell. מריצים את הפקודה הבאה כדי לתאר את שירות התפריט ולשמור את כתובת ה-URL במשתנה הסביבה. משתנה הסביבה הזה ישמש להגדרת המשימה ב-Cloud Run.
MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
--region=$REGION \
--format=json | jq \
--raw-output ".status.url")
יצירת משימה ב-Cloud Run כדי לנקות פריטים שנכשלו בתפריט שגילם עולה על דקה אחת [מוגדר על ידי FAILED_ITEM_AGE
].
gcloud beta run jobs create cleanup-service \
--image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
--set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
--set-env-vars FAILED_ITEM_AGE=1 \
--region $REGION
פלט לדוגמה:
Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1] OK Creating job... Done. Done. Job [cleanup-service] has successfully been created.
עוברים לקטע JOBS ב-Cloud Run במסוף ובודקים את המשימה שנוצרה.
לוחצים על המשימה ומעיינים בכרטיסיות הזמינות: HISTORY, LOGS, CONFIGURATION ו-YAML.
כדי לוודא שמשתני הסביבה הוגדרו, בודקים את הקטע CONFIGURATION (הגדרה) של המשימה במסוף:
(אופציונלי) אם רוצים לשנות את המשתנים 'גיל הפריט שנכשל' או 'כתובת ה-URL של שירות התפריט' אחרי יצירת המשימה ב-Cloud Run, אפשר להשתמש בפקודת העדכון:
gcloud beta run jobs update cleanup-service \
--image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
--set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
--set-env-vars FAILED_ITEM_AGE=1 \
--region $REGION
כדי לאמת את המשימה, מריצים את המשימה ב-Cloud Run באמצעות הפקודה הבאה:
gcloud beta run jobs execute cleanup-service --region=$REGION
פלט לדוגמה:
OK Creating execution... Done. OK Provisioning resources... Done. Execution [cleanup-service-rlxs4] has successfully started running. View details about this execution by running: gcloud beta run jobs executions describe cleanup-service-rlxs4
עוברים אל הכרטיסייה LOGS כדי לבדוק את הפלט של המשימה. ביומני המערכת אמורים להופיע הגיל של הפריט שנכשל וכתובת ה-URL של שירות התפריט.
5. הגדרת לוח זמנים למשימה ב-Cloud Run
Cloud Scheduler הוא מתזמן משימות cron המנוהל באופן מלא ברמת הארגון. הוא מאפשר לתזמן כמעט כל משימה, כולל משימות באצווה, משימות Big Data, פעולות בתשתית הענן ועוד.
אחת מהשיטות המומלצות לאבטחה בעבודה עם משימה ב-Cloud Scheduler היא להריץ כל משימה באמצעות פרטי כניסה נפרדים. בשלב הזה יוצרים חשבון שירות לשימוש במשימה של מתזמן הניקוי.
export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa
gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}
המשימה ב-Cloud Scheduler תצטרך הרשאות לביצוע קריאות למשימות ב-Cloud Run.
מקצים את התפקיד Cloud Run Invoker
לחשבון השירות שבו נעשה שימוש במשימה של Cloud Scheduler:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/run.invoker"
בשלב הבא תגדירו לוח זמנים להפעלת המשימה של שירות הניקוי.
יש מספר סוגי יעדים שנתמכים ב-Cloud Scheduler.
- HTTP
- Pub/Sub
- App Engine HTTP
תיצורו משימה של מתזמן באמצעות סוג יעד HTTP.
למטרות הדגמה, תזמנו את הפעלת הקוד כל 5 דקות.
gcloud scheduler jobs create http cleanup-schedule \
--location $REGION \
--schedule="*/5 * * * *" \
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
--http-method POST \
--oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
בודקים את הפרמטר uri
שמשמש לקריאה של משימה ב-Cloud Run:
REGION
ו-PROJECT_ID
– האזור ומזהה הפרויקט ב-Cloud Run שבהם פרוסה המשימה של שירות הניקויcleanup-service
– שם המשימה ב-Cloud Run
עוברים אל Cloud Scheduler במסוף כדי לבדוק את המשימה שנוצרה בלוח הזמנים:
בודקים את האפשרויות הזמינות בתפריט 'פעולות'.
6. בדיקת משימה ב-Cloud Run
באמצעות נקודות הקצה של שירות התפריט, אפשר לבדוק את הפריטים הקיימים בתפריט ואת הסטטוס שלהם:
curl ${MENU_SERVICE_URL}/menu | jq
פלט:
יוצגו 3 פריטים בתפריט בסטטוס Ready
.
שינוי הסטטוס של פריט התפריט מס' 1 ל-Failed
:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Failed"}' | jq
ממתינים דקה. כדי שפריט התפריט יימחק, הוא צריך להיות בן דקה אחת, כפי שמוגדר על ידי הפרמטר FAILED_ITEM_AGE
.
אפשר להמתין להפעלה המתוזמנת הבאה או לאלץ את ביצוע המשימה מהמסוף.
יש כמה דרכים להפעיל משימה, דרך ממשק המשתמש או משורת הפקודה.
בדוגמה הזו, מריצים את הפקודה ב-Cloud Shell(אפשרות 3) כדי להפעיל את המשימה.
- ב-Cloud Scheduler, על ידי בחירה באפשרות 'אילוץ הפעלת משימה' בתפריט Actions (פעולות).
- מCloud Run Job, לוחצים על הלחצן 'EXECUTE'.
- ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud beta run jobs execute cleanup-service --region=$REGION
עוברים לקטע JOBS ב-Cloud Run, פותחים את הכרטיסייה LOGS ומוודאים שפריט התפריט נמחק.
מסננים את היומנים לפי מילת המפתח 'מחיקת' כדי למצוא את היומנים.
משתמשים בנקודות הקצה של Menu Service כדי לבדוק את הפריטים הקיימים בתפריט דרך נקודת הקצה ל-REST.
curl ${MENU_SERVICE_URL}/menu | jq
פלט:
יוצגו 2 פריטים בתפריט בסטטוס Ready
.
7. מעולה!
כל הכבוד, סיימת את הקודלאב!
הנושאים שעסקנו בהם:
- איך יוצרים משימות ב-Cloud Run
- איך מפעילים משימות ב-Cloud Run
- איך יוצרים משימות ב-Cloud Scheduler
- איך מוודאים שהמשימות בוצעו
השלב הבא:
מדריכי Codelab נוספים של Cymbal Eats:
- הפעלת תהליכי עבודה ב-Cloud באמצעות Eventarc
- הפעלת עיבוד אירועים מ-Cloud Storage
- התחברות ל-CloudSQL פרטי מ-Cloud Run
- חיבור למסדי נתונים מנוהלים מ-Cloud Run
- אבטחה של אפליקציה ללא שרת באמצעות שרת proxy לאימות זהויות (IAP)
- פריסה מאובטחת ב-Cloud Run
- אבטחת תעבורת הנתונים הנכנסת (ingress) ב-Cloud Run
- התחברות ל-AlloyDB פרטי מ-GKE Autopilot
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.