הפעלת משימות של Cloud Run באמצעות Cloud Scheduler

1. סקירה כללית

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

מהן משימות ב-Cloud Run?

המשימה ב-Cloud Run מפעילה קונטיינר שלא ממלא בקשות אינטרנט, אלא מבצע משימות תפעוליות או עיבוד נתונים. מאגר התגים יריץ את המשימה וייצא ממנה בסיום.

משימת ניקוי

משימת הניקוי תאחזר את האפשרויות בתפריט בסטטוס 'נכשל' ותמחק אותן. כשיוצרים אפשרויות חדשות בתפריט, מתבצע ניתוח של התמונות באמצעות Vision API כדי לקבוע אם מדובר בפריט אוכל או לא. בתמונות שנכשלו באימות הזה, הסטטוס של האפשרויות בתפריט יעודכן ל'נכשל' ולאחר מכן יימחק על ידי משימת הניקוי.

d74200f0bd14d350.png

מה תלמדו

בשיעור Lab זה תלמדו איך:

  • יצירת משימות ב-Cloud Run
  • הפעלת משימות ב-Cloud Run
  • יצירת משימות Cloud Scheduler
  • אימות ביצוע משימות

דרישות מוקדמות

  • שיעור ה-Lab הזה מבוסס על היכרות עם הסביבות של Cloud Console והמעטפת.
  • ניסיון קודם ב-Cloud Run וב-Cloud Scheduler מועיל אבל לא נדרש.

2. הגדרה ודרישות

הגדרת פרויקט ב-Cloud

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הגדרת סביבה

לוחצים על הסמל שמופיע מימין לסרגל החיפוש כדי להפעיל את Cloud Shell.

eb0157a992f16fa3.png

מ-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.

45f480cd1b9a995.png

נכנסים לספרייה שמכילה את שירות הניקוי ובודקים את הקבצים שמרכיבים את המשימה:

cd ~/cymbal-eats/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 כדי לאחסן תמונות Docer למשימת הניקוי:

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 ובודקים את התמונה שפורסמה:

fb95ae38baa7c543.png

חוזרים לכרטיסייה השנייה של 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.

b12c8e312de3b66.png

כדי לוודא שהוגדרו משתני סביבה, עיינו בקטע CONFIGURATION של המשימה במסוף:

724c2919d05349c8.png

(אופציונלי) אם רוצים לשנות את המשתנים של כתובת ה-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 של הפריט 'גיל פריט' ו'שירות תפריט' אמור להופיע ביומנים.

518cb00036a2561f.png

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 במסוף כדי לבדוק את משימת התזמון שנוצרה:

3bc9120df7fc6ed.png

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

7945908025dd2f2b.png

6. בדיקת משימת Cloud Run

באמצעות נקודות הקצה של Service 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) כדי להפעיל את המשימה.

  1. על ידי בחירה באפשרות 'אילוץ הרצה של משימה', ב-Cloud Scheduler מתפריט הפעולות.

6c8cbeae6165ba4a.png

  1. ממשימה ב-Cloud Run לוחצים על EXECUTE. לחצן.

229c22288882b5c3.png

  1. מריצים את הפקודה הבאה ב-Cloud Shell:
gcloud beta run jobs execute cleanup-service --region=$REGION

עוברים לקטע Cloud Run JOBS, פותחים את הכרטיסייה LOGS ומוודאים שהאפשרות בתפריט נמחקה.

50829ae27b135b2d.png

סינון יומנים לפי האפשרות 'מחיקה' במילת המפתח כדי למצוא את היומנים.

d94fb9e444b1c1b8.png

שימוש בנקודות קצה של שירות תפריט כדי לבדוק אפשרויות קיימות בתפריט דרך נקודת הקצה ל-REST.

curl ${MENU_SERVICE_URL}/menu | jq

פלט:

יוצגו 2 אפשרויות בתפריט בסטטוס Ready.

7. מעולה!

כל הכבוד, סיימת את ה-Codelab!

נושאים שטיפלנו בהם:

  • איך יוצרים משימות ב-Cloud Run
  • איך לבצע משימות ב-Cloud Run
  • איך יוצרים משימות של Cloud Scheduler
  • איך מאמתים ביצוע משימות

השלב הבא:

בקישורים הבאים תוכלו למצוא עוד מעבדי קוד Labs של Cymbal Eats:

הסרת המשאבים

כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שנעשה בהם שימוש במדריך הזה, צריך למחוק את הפרויקט שמכיל את המשאבים או לשמור את הפרויקט ולמחוק את המשאבים הספציפיים.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.