במדריך הזה מוסבר איך להשתמש ב-Workflows כדי לקשר בין סדרה של שירותים. אפשר ליצור אפליקציה גמישה ללא שרת (serverless) על ידי חיבור של שני שירותי HTTP ציבוריים באמצעות פונקציות של Cloud Run, API חיצוני בארכיטקטורת REST ושירות פרטי של Cloud Run.
מטרות
במדריך הזה נשתמש ב-Google Cloud CLI כדי ליצור תהליך עבודה יחיד, שבו נחבר שירות אחד בכל פעם:
- פורסים שתי פונקציות Cloud Run: הפונקציה הראשונה יוצרת מספר אקראי, ואז מעבירה את המספר הזה לפונקציה השנייה שמכפילה אותו.
- באמצעות Workflows, מחברים את שתי פונקציות ה-HTTP. מריצים את תהליך העבודה ומחזירים תוצאה שמועברת ל-API חיצוני.
- באמצעות Workflows, מחברים API חיצוני של HTTP שמחזיר את
logלמספר נתון. הפעלת תהליך העבודה והחזרת תוצאה שמועברת לשירות Cloud Run. - פריסה של שירות Cloud Run שמאפשר גישה מאומתת בלבד. השירות מחזיר את
math.floorעבור מספר נתון. - באמצעות Workflows, מקשרים את שירות Cloud Run, מריצים את כל תהליך העבודה ומחזירים תוצאה סופית.
התרשים הבא מציג סקירה כללית של התהליך וגם הדמיה של תהליך העבודה הסופי:
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
לפני שמתחילים
יכול להיות שהגבלות אבטחה שהוגדרו בארגון שלכם ימנעו מכם להשלים את השלבים הבאים. מידע לפתרון בעיות זמין במאמר פיתוח אפליקציות בסביבה מוגבלת. Google Cloud
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Artifact Registry, Cloud Build, Cloud Run, Cloud Run Functions, Cloud Storage ו-Workflows:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com -
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Artifact Registry, Cloud Build, Cloud Run, Cloud Run Functions, Cloud Storage ו-Workflows:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com - מעדכנים את הרכיבים של Google Cloud CLI:
gcloud components update
- אם אתם מריצים פקודות ב-Cloud Shell, אתם כבר מאומתים ב-CLI של gcloud. אחרת, אתם צריכים להיכנס באמצעות החשבון שלכם:
gcloud auth login
- מגדירים את מיקום ברירת המחדל שבו משתמשים במדריך הזה:
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
מחליפים את
REGIONבמיקום של Workflows שנתמך לבחירתכם. -
אם אתם יוצרי הפרויקט, מוקצה לכם תפקיד הבעלים הבסיסי (
roles/owner). כברירת מחדל, תפקיד ניהול הזהויות והרשאות הגישה (IAM) הזה כולל את ההרשאות שנדרשות לגישה מלאה לרוב המשאבים Google Cloud, ואפשר לדלג על השלב הזה.אם אתם לא יוצרי הפרויקט, צריך להעניק את ההרשאות הנדרשות בחשבון המשתמש המתאים בפרויקט. לדוגמה, חשבון משתמש יכול להיות חשבון Google (למשתמשי קצה) או חשבון שירות (לאפליקציות ולעומסי עבודה ממוחשבים). מידע נוסף זמין בדף תפקידים והרשאות של יעד האירוע.
ההרשאות הנדרשות
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- עריכה ב-Cloud Build (
roles/cloudbuild.builds.editor) - Cloud Functions Developer (
roles/cloudfunctions.developer) - אדמין ב-Cloud Run (
roles/run.admin) - יצירת חשבונות שירות (
roles/iam.serviceAccountCreator) - אדמין IAM בפרויקט (
roles/resourcemanager.projectIamAdmin) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) - צרכן שימוש בשירות (
roles/serviceusage.serviceUsageConsumer) - אדמין באחסון (
roles/storage.admin) - עורך תהליכי עבודה (
roles/workflows.editor)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
- עריכה ב-Cloud Build (
- כשפורסים את תהליך העבודה, משייכים אותו לחשבון שירות ספציפי. יוצרים חשבון שירות לשימוש ב-Workflows:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- כל שירותי Cloud Run נפרסים באופן פרטי כברירת מחדל, ורק בעלי הפרויקט, עורכי הפרויקט, אדמינים של Cloud Run ומשתמשים עם הרשאה להפעלת שירותים ב-Cloud Run יכולים להפעיל אותם. כדי לאפשר לחשבון השירות לקרוא לשירות Cloud Run מאומת, צריך להקצות את התפקיד
run.invokerלחשבון השירות של Workflows:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
פריסת הפונקציות הראשונות של Cloud Run
אחרי קבלת בקשת HTTP, פונקציית ה-HTTP הזו יוצרת מספר אקראי בין 1 ל-100, ואז מחזירה את המספר בפורמט JSON.
יוצרים ספרייה בשם
randomgenועוברים אליה:mkdir ~/randomgen cd ~/randomgen
יוצרים קובץ טקסט בשם
main.pyשמכיל את קוד Python הבא:כדי לתמוך בתלות ב-Flask לעיבוד HTTP, יוצרים קובץ טקסט עבור מנהל חבילות pip. נותנים לו את שם הקובץ
requirements.txtומוסיפים את הטקסט הבא:פורסים את הפונקציה עם טריגר HTTP ומאפשרים גישה ללא אימות:
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated
יכול להיות שיחלפו כמה דקות עד שהפונקציה תופעל. לחלופין, אפשר להשתמש בממשק של Cloud Run functions במסוף Google Cloud כדי לפרוס את הפונקציה.
אחרי שפורסים את הפונקציה
randomgen, אפשר לאשר את הנכסhttpsTrigger.url:gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
שומרים את כתובת ה-URL. תצטרכו להוסיף אותו לקובץ המקור של זרימת העבודה בתרגילים הבאים.
אפשר לנסות את הפונקציה באמצעות פקודת ה-curl הבאה:
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
מספר נוצר באופן אקראי ומוחזר.
פריסת הפונקציות השנייה של Cloud Run
אחרי קבלת בקשת HTTP, פונקציית ה-HTTP הזו מחלצת את הערך input מגוף ה-JSON, מכפילה אותו ב-2 ומחזירה את התוצאה בפורמט JSON.
מנווטים חזרה לספריית הבית:
cd ~
יוצרים ספרייה בשם
multiplyועוברים אליה:mkdir ~/multiply cd ~/multiply
יוצרים קובץ טקסט בשם
main.pyשמכיל את קוד Python הבא:כדי לתמוך בתלות ב-Flask לעיבוד HTTP, יוצרים קובץ טקסט עבור מנהל חבילות pip. נותנים לו את שם הקובץ
requirements.txtומוסיפים את הטקסט הבא:פורסים את הפונקציה עם טריגר HTTP ומאפשרים גישה ללא אימות:
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --trigger-http \ --allow-unauthenticated
יכול להיות שיחלפו כמה דקות עד שהפונקציה תופעל. לחלופין, אפשר להשתמש בממשק של Cloud Run functions במסוף Google Cloud כדי לפרוס את הפונקציה.
אחרי שפורסים את הפונקציה
multiply, אפשר לאשר את הנכסhttpsTrigger.url:gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
שומרים את כתובת ה-URL. תצטרכו להוסיף אותו לקובץ המקור של זרימת העבודה בתרגילים הבאים.
אפשר לנסות את הפונקציה באמצעות פקודת ה-curl הבאה:
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}'
הפונקציה תחזיר את המספר 10.
חיבור בין שתי פונקציות Cloud Run בתהליך עבודה
תהליך עבודה מורכב מסדרה של שלבים שמתוארים באמצעות תחביר Workflows, שאפשר לכתוב בפורמט YAML או JSON. זו ההגדרה של תהליך העבודה. הסבר מפורט זמין בדף הפניה לתחביר.
מנווטים חזרה לספריית הבית:
cd ~
יוצרים קובץ טקסט בשם
workflow.yamlעם התוכן הבא:- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}- מחליפים את
RANDOMGEN_FUNCTION_URLבכתובת ה-URL של הפונקציהrandomgen. - מחליפים את
MULTIPLY_FUNCTION_URLבכתובת ה-URL של הפונקציהmultiply.
קובץ המקור הזה מקשר בין שתי פונקציות HTTP ומחזיר תוצאה סופית.
- מחליפים את
אחרי שיוצרים את תהליך העבודה, אפשר לפרוס אותו, וכך הוא מוכן להרצה.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
מחליפים את
WORKFLOW_NAMEבשם של זרימת העבודה.מריצים את תהליך העבודה:
gcloud workflows run WORKFLOW_NAME
הרצה היא הפעלה יחידה של הלוגיקה שמופיעה בהגדרת תהליך העבודה. כל ההרצות של תהליכי העבודה הן עצמאיות, וההתאמה המהירה של Workflows מאפשרת מספר גבוה של הרצות בו-זמניות.
אחרי הפעלת תהליך העבודה, הפלט אמור להיראות כך:
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
חיבור שירות REST ציבורי בתהליך העבודה
מעדכנים את תהליך העבודה הקיים ומקשרים API ציבורי ל-REST (math.js) שיכול להעריך ביטויים מתמטיים. לדוגמה, curl https://api.mathjs.org/v4/?'expr=log(56)'.
שימו לב: אחרי שפורסים את תהליך העבודה, אפשר לערוך אותו גם דרך הדף Workflows במסוף Google Cloud .
עורכים את קובץ המקור של תהליך העבודה ומחליפים אותו בתוכן הבא:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}- מחליפים את
RANDOMGEN_FUNCTION_URLבכתובת ה-URL של הפונקציהrandomgen. - מחליפים את
MULTIPLY_FUNCTION_URLבכתובת ה-URL של הפונקציהmultiply.
הפעולה הזו מקשרת את שירות ה-REST החיצוני לפונקציות Cloud Run ומחזירה תוצאה סופית.
- מחליפים את
פורסים את תהליך העבודה ששיניתם:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
פריסת שירות Cloud Run
פריסת שירות Cloud Run, שאחרי קבלת בקשת HTTP, מחלץ את input מגוף ה-JSON, מחשב את math.floor ומחזיר את התוצאה.
יוצרים ספרייה בשם
floorועוברים אליה:mkdir ~/floor cd ~/floor
יוצרים קובץ טקסט בשם
app.pyשמכיל את קוד Python הבא:באותה תיקייה, יוצרים קובץ
Dockerfileעם התוכן הבא:יוצרים מאגר רגיל ב-Artifact Registry שבו אפשר לאחסן את קובץ האימג' של קונטיינר Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
מחליפים את
REPOSITORYבשם ייחודי למאגר.יוצרים את קובץ האימג' של הקונטיינר:
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
פורסים את קובץ האימג' של הקונטיינר ב-Cloud Run, ומוודאים שהוא מקבל רק קריאות מאומתות:
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --no-allow-unauthenticated
כשתראו את כתובת ה-URL של השירות, סימן שהפריסה הושלמה. תצטרכו לציין את כתובת ה-URL הזו כשמעדכנים את הגדרת תהליך העבודה.
חיבור שירות Cloud Run בתהליך העבודה
מעדכנים את תהליך העבודה הקיים ומציינים את כתובת ה-URL של שירות Cloud Run.
מנווטים חזרה לספריית הבית:
cd ~
עורכים את קובץ המקור של תהליך העבודה ומחליפים אותו בתוכן הבא:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}- מחליפים את
RANDOMGEN_FUNCTION_URLבכתובת ה-URL של הפונקציהrandomgen. - מחליפים את
MULTIPLY_FUNCTION_URLבכתובת ה-URL של הפונקציהmultiply. - מחליפים את
CLOUD_RUN_SERVICE_URLבכתובת ה-URL של שירות Cloud Run.
הפעולה הזו מחברת את שירות Cloud Run לתהליך העבודה. שימו לב שהמפתח
authמוודא שאסימון אימות מועבר בקריאה לשירות Cloud Run. מידע נוסף זמין במאמר בנושא שליחת בקשות מאומתות מתהליך עבודה.- מחליפים את
פורסים את תהליך העבודה ששיניתם:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
מריצים את תהליך העבודה הסופי:
gcloud workflows run WORKFLOW_NAME
הפלט אמור להיראות כך:
result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
כל הכבוד! פרסתם והפעלתם תהליך עבודה שמקשר בין סדרה של שירותים.
כדי ליצור תהליכי עבודה מורכבים יותר באמצעות ביטויים, מעברים מותנים, קידוד או פענוח Base64, תהליכי עבודה משניים ועוד, אפשר לעיין בהפניה לתחביר של Workflows ובסקירה הכללית של הספרייה הרגילה.
הסרת המשאבים
אם יצרתם פרויקט חדש בשביל המדריך הזה, תמחקו את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שנוספו במדריך הזה, תצטרכו למחוק את המשאבים שנוצרו לצורך המדריך.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבי הדרכה
מחיקת שירות Cloud Run שפרסתם במדריך הזה.
מחיקת תהליך העבודה שיצרתם במדריך הזה.
מחיקת קובץ אימג' של קונטיינר מ-Artifact Registry.
מסירים את הגדרות ברירת המחדל של Google Cloud CLI שהוספתם במהלך ההגדרה של המדריך:
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project