1. סקירה כללית
בשיעור ה-Lab הזה תיצרו משימה ב-Cloud Run ותגדירו משימה ב-Cloud Scheduler. תפרסו את Cymbal Eats Menu Service באמצעות סקריפט ההגדרה. תצרו משימת Cloud Run שתבצע קריאות ל-API של שירות התפריט של Cymbal Eats. תריצו את העבודה באמצעות Google Cloud CLI ותגדירו לוח זמנים לעבודה. כדי לאמת את הביצוע, תצטרכו לבדוק את היומנים ולבצע קריאות ל-API של שירות התפריטים כדי לוודא שפריטי התפריט נמחקו.
מהן משימות Cloud Run?
משימה ב-Cloud Run מפעילה קונטיינר שלא משרת בקשות אינטרנט, אלא מבצע משימות תפעוליות או עיבוד נתונים. הקונטיינר יפעיל את המשימה ויצא בסיום.
משימת ניקוי נתונים
משימת שירות הניקוי תאחזר פריטים בתפריט עם הסטטוס 'נכשל' ותמחק אותם. כשיוצרים פריטים חדשים בתפריט, המערכת מנתחת את התמונות באמצעות Vision API כדי לזהות אם מדובר בפריט מזון או לא. אם תמונות לא יעברו את האימות הזה, הסטטוס של פריטי התפריט יעודכן ל'נכשל' והן יימחקו בהמשך על ידי עבודת הניקוי.

מה תלמדו
בשיעור Lab זה תלמדו איך:
- יצירת משימות Cloud Run
- הפעלת משימות ב-Cloud Run
- יצירת משימות ב-Cloud Scheduler
- אימות של ביצוע משימות
דרישות מוקדמות
- ההנחה בשיעור ה-Lab הזה היא שאתם מכירים את Cloud Console ואת סביבות ה-Shell.
- ניסיון קודם עם Cloud Run ו-Cloud Scheduler יכול לעזור, אבל הוא לא חובה.
2. הגדרה ודרישות
הגדרה של פרויקט ב-Cloud
- נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-
PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
הגדרת הסביבה
לוחצים על הסמל משמאל לסרגל החיפוש כדי להפעיל את Cloud Shell.

מריצים את הפקודה הבאה מ-Cloud Shell כדי לשכפל את קוד האפליקציה ממאגר הזה ועוברים לספרייה שמכילה את שירות התפריט:
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
פורסים את שירות התפריט באמצעות סקריפט ההגדרה ב-Cloud Run. שירות התפריט הוא מיקרו-שירות מבוסס-Java שנבנה באמצעות מסגרת Quarkus, עם מסד נתונים של Cloud SQL Postgres לקצה העורפי. שירות התפריט הוא תלות בזמן ריצה עבור עבודת 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 Job. -
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 (הגדרה) של המשימה במסוף:

(אופציונלי) אם רוצים לשנות את המשתנים Failed Item Age או Menu Service 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 Job:
-
REGIONו-PROJECT_ID– האזור ומזהה הפרויקט ב-Cloud Run שבהם משימת שירות הניקוי נפרסת -
cleanup-service– שם המשימה ב-Cloud Run
עוברים אל Cloud Scheduler במסוף כדי לבדוק את משימת התזמון שנוצרה:

בודקים את האפשרויות הזמינות בתפריט 'פעולות'.

6. בדיקת משימה ב-Cloud Run
כדי לבדוק את הפריטים הקיימים בתפריט ואת הסטטוס שלהם, משתמשים בנקודות הקצה של Menu Service:
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 על ידי בחירה באפשרות 'הפעלת משימה בכוח' בתפריט 'פעולות'.

- מתוך Cloud Run Job על ידי לחיצה על הלחצן EXECUTE.

- מריצים את הפקודה הבאה ב-Cloud Shell:
gcloud beta run jobs execute cleanup-service --region=$REGION
עוברים לקטע Cloud Run JOBS, פותחים את הכרטיסייה LOGS ומוודאים שפריט התפריט נמחק.

כדי למצוא את היומנים, מסננים את היומנים לפי מילת המפתח 'מחיקה'.

אפשר להשתמש בנקודות הקצה של Menu Service כדי לבדוק פריטים קיימים בתפריט דרך נקודת הקצה של REST.
curl ${MENU_SERVICE_URL}/menu | jq
פלט:
יוצגו 2 פריטים בתפריט עם הסטטוס Ready.
7. מעולה!
כל הכבוד, סיימתם את ה-Codelab!
הנושאים שדיברנו עליהם:
- איך יוצרים משימות Cloud Run
- איך מריצים משימות ב-Cloud Run
- איך יוצרים משימות ב-Cloud Scheduler
- איך מאמתים את ההרצה של משימות
השלב הבא:
כדאי לעיין במדריכי Codelab נוספים של Cymbal Eats:
- הפעלת Cloud Workflows באמצעות Eventarc
- הפעלת עיבוד אירועים מ-Cloud Storage
- התחברות ל-Cloud SQL פרטי מ-Cloud Run
- חיבור למסדי נתונים מנוהלים באופן מלא מ-Cloud Run
- אבטחת אפליקציה ללא שרת באמצעות שרת proxy לאימות זהויות (IAP)
- פריסה מאובטחת ב-Cloud Run
- אבטחת תנועת נתונים נכנסת ב-Cloud Run
- התחברות ל-AlloyDB פרטי מ-GKE Autopilot
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.