1. סקירה כללית
יכול להיות שפריסת אפליקציית אינטרנט בפעם הראשונה תיראה לכם מאיימת. גם אחרי הפריסה הראשונה, אם התהליך מסובך מדי, יכול להיות שתמנעו מפריסת גרסאות חדשות של האפליקציה. בעזרת פריסה רציפה, אתם יכולים לפרוס שינויים באפליקציה שלכם בקלות ובאופן אוטומטי.
במעבדה הזו תכתבו אפליקציית אינטרנט ותגדירו את Cloud Run כך שהאפליקציה תיפרס באופן אוטומטי כשמתבצע שינוי בקוד המקור שלה. לאחר מכן משנים את הבקשה ומפרסמים אותה מחדש.
מה תלמדו
- כתיבת אפליקציית אינטרנט באמצעות Cloud Shell Editor
- שמירת קוד האפליקציה ב-GitHub
- פריסה אוטומטית של האפליקציה ב-Cloud Run
- הוספת AI גנרטיבי לאפליקציה באמצעות Vertex AI
2. דרישות מוקדמות
- אם אין לכם חשבון Google, אתם צריכים ליצור חשבון Google.
- משתמשים בחשבון לשימוש אישי במקום בחשבון לצורכי עבודה או בחשבון בית ספרי. יכול להיות שבחשבונות לצורכי עבודה או בחשבונות בית ספריים יש הגבלות שימנעו מכם להפעיל את ממשקי ה-API שנדרשים למעבדה הזו.
- אם אין לכם חשבון ב-GitHub, אתם צריכים ליצור חשבון ב-GitHub
- אם יש לכם חשבון GitHub קיים, אתם יכולים להשתמש בו. יש סיכוי גבוה יותר ש-GitHub יחסום חשבון חדש כספאם.
- כדי להקטין את הסיכוי שהחשבון שלכם יסומן כספאם, מומלץ להגדיר אימות דו-שלבי בחשבון GitHub.
3. הגדרת הפרויקט
- נכנסים למסוף Google Cloud.
- מפעילים את החיוב במסוף Cloud.
- העלות של השלמת ה-Lab הזה צריכה להיות פחות מ-1 $ על משאבי Cloud.
- כדי למנוע חיובים נוספים, אפשר למחוק את המשאבים לפי השלבים שמפורטים בסוף ה-Lab הזה.
- משתמשים חדשים זכאים לתקופת ניסיון בחינם בשווי 300$.
- מגיעים לאירוע בנושא AI גנרטיבי למפתחים? יכול להיות שיהיה זמין קרדיט בסך 1$.
- יוצרים פרויקט חדש או בוחרים להשתמש בפרויקט קיים.
- מוודאים שהחיוב מופעל בדף My projects בחיוב ב-Cloud
- אם הפרויקט החדש מופיע עם הערך
Billing is disabledבעמודהBilling account:- לוחצים על סמל האפשרויות הנוספות (3 נקודות) בעמודה
Actions. - לוחצים על שינוי פרטי החיוב.
- בוחרים את החשבון לחיוב שבו רוצים להשתמש.
- לוחצים על סמל האפשרויות הנוספות (3 נקודות) בעמודה
- אם אתם משתתפים באירוע Gen AI for Devs, סביר להניח שהשם של החשבון יהיה Google Cloud Platform Trial Billing Account
- אם הפרויקט החדש מופיע עם הערך
4. פתיחת Cloud Shell Editor
- עוברים אל Cloud Shell Editor
- אם הטרמינל לא מופיע בתחתית המסך, פותחים אותו:
- לוחצים על סמל האפשרויות הנוספות (3 קווים)
. - לוחצים על Terminal (מסוף).
- לוחצים על New Terminal (טרמינל חדש)
.
- לוחצים על סמל האפשרויות הנוספות (3 קווים)
- בטרמינל, מגדירים את הפרויקט באמצעות הפקודה הבאה:
- פורמט:
gcloud config set project [PROJECT_ID] - דוגמה:
gcloud config set project lab-project-id-example - אם אתם לא זוכרים את מזהה הפרויקט:
- כדי לראות את כל מזהי הפרויקטים, מריצים את הפקודה:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

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

- תוצג ההודעה הבאה:
אם מופיעUpdated property [core/project].
WARNINGומוצגת השאלהDo you want to continue (Y/N)?, סביר להניח שהזנתם את מזהה הפרויקט בצורה שגויה. לוחצים עלN, לוחצים עלEnterומנסים להריץ שוב את הפקודהgcloud config set project.
5. הפעלת ממשקי API
בטרמינל, מפעילים את ממשקי ה-API:
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com
הפקודה הזו עשויה להימשך כמה דקות, אבל בסופו של דבר היא אמורה להפיק הודעה דומה לזו:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. הגדרת Git
- מגדירים את כתובת האימייל של המשתמש ב-Git:
git config --global user.email "you@example.com" - מגדירים את שם המשתמש הגלובלי של Git:
git config --global user.name "Your Name" - מגדירים את ענף ברירת המחדל הגלובלי של git ל-
main:git config --global init.defaultBranch main
7. כתיבת הקוד
כדי לכתוב אפליקציה ב-Go:
- מנווטים לספריית הבית:
cd ~ - יוצרים את הספרייה
codelab-genai:mkdir codelab-genai - מנווטים לספרייה
codelab-genai:cd codelab-genai - מאתחלים קובץ go.mod כדי להצהיר על המודול:
go mod init codelab-genai - יוצרים קובץ
main.go:touch main.go - פותחים את הקובץ
main.goב-Cloud Shell Editor: קובץ ריק אמור להופיע בחלק העליון של המסך. כאן אפשר לערוך את הקובץcloudshell edit main.gomain.go.
- עורכים את
main.goומדביקים בו את הקוד הבא: אחרי כמה שניות, Cloud Shell Editor ישמור את הקוד באופן אוטומטי. הקוד הזה מגיב לבקשות HTTP עם הודעת הפתיחה 'Hello world!'.package main import ( "fmt" "log" "net/http" "os" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, world!") }) port := os.Getenv("PORT") if port == "" { port = "8080" } if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatal(err) } }
הקוד הראשוני של האפליקציה מוכן לאחסון בבקרת גרסאות.
8. יצירת מאגר
- חוזרים לטרמינל של Cloud Shell בתחתית המסך.
- מוודאים שאתם עדיין בספרייה הנכונה:
cd ~/codelab-genai - אתחול מאגר Git
git init -b main - התחברות אל GitHub CLI
מקישים עלgh auth loginEnterכדי לאשר את אפשרויות ברירת המחדל ופועלים לפי ההוראות בכלי GitHub CLI, כולל:- לאיזה חשבון ברצונך להיכנס?
GitHub.com - מהו הפרוטוקול המועדף עליך לפעולות Git במארח הזה?
HTTPS - האם לאמת את Git באמצעות פרטי הכניסה ל-GitHub?
Y(מדלגים אם האפשרות הזו לא מופיעה). - איך היית רוצה לאמת את GitHub CLI?
Login with a web browser - העתקת הקוד החד-פעמי
- פותחים את https://github.com/login/device
- הדבקת הקוד החד-פעמי
- לוחצים על Authorize github (מתן הרשאה ל-GitHub).
- השלמת הכניסה
- לאיזה חשבון ברצונך להיכנס?
- מוודאים שאתם מחוברים:
אם הכניסה הצליחה, הפקודה הזו אמורה להחזיר את שם המשתמש שלכם ב-GitHub.gh api user -q ".login" - יצירת משתנה
GITHUB_USERNAMEGITHUB_USERNAME=$(gh api user -q ".login") - מוודאים שיצרתם את משתנה הסביבה:
אם יצרתם את המשתנה בהצלחה, שם המשתמש שלכם ב-GitHub אמור להיות מוצג.echo ${GITHUB_USERNAME} - יוצרים מאגר ריק ב-GitHub בשם
codelab-genai: אם מופיעה השגיאה:gh repo create codelab-genai --private במקרה כזה, כבר יש לכם מאגר בשםGraphQL: Name already exists on this account (createRepository)
codelab-genai. יש שתי אפשרויות להמשך המדריך הזה:- מחיקת המאגר הקיים ב-GitHub
- יוצרים מאגר עם שם אחר וזוכרים לשנות אותו בפקודות הבאות.
- מוסיפים את מאגר
codelab-genaiכמאגר מרוחקorigin:git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
9. שיתוף הקוד
- מוודאים שאתם בספרייה הנכונה:
cd ~/codelab-genai - כדי להוסיף את כל הקבצים בספרייה הנוכחית לקומיט:
git add . - יוצרים את הקומיט הראשון:
git commit -m "add http server" - מעבירים את השמירה לענף
mainבמאגרorigin:git push -u origin main
אתם יכולים להריץ את הפקודה הזו ולעבור לכתובת ה-URL שמתקבלת כדי לראות את קוד האפליקציה שלכם ב-GitHub:
echo -e "\n\nTo see your code, visit this URL:\n \
https://github.com/${GITHUB_USERNAME}/codelab-genai/blob/main/main.go \n\n"
10. הגדרת פריסות אוטומטיות
- משאירים את הכרטיסייה של Cloud Shell Editor פתוחה. נחזור לכרטיסייה הזו בהמשך.
- בכרטיסייה חדשה, נכנסים אל הדף Cloud Run.
- בוחרים את הפרויקט הנכון ב-Google Cloud במסוף

- לוחצים על CONNECT REPO (קישור מאגר)
- לוחצים על SET UP WITH CLOUD BUILD (הגדרה באמצעות Cloud Build).
- בוחרים באפשרות GitHub בתור ספק המאגר
- .
- אם לא נכנסתם לחשבון GitHub בדפדפן, נכנסים באמצעות פרטי הכניסה.
- לוחצים על אימות ואז על המשך.
- אחרי שמתחברים, מוצגת הודעה בדף Cloud Run: The GitHub App is not installed on any of your repositories (אפליקציית GitHub לא מותקנת באף אחד מהמאגרים שלך).
- לוחצים על הלחצן INSTALL GOOGLE CLOUD BUILD (התקנת Google Cloud Build).
- בדף Installation Setup (הגדרת ההתקנה), בוחרים באפשרות Only select repositories (בחירת מאגרים בלבד) ובוחרים במאגר codelab-genai שיצרתם באמצעות CLI.
- לוחצים על התקנה.
- הערה: אם יש לכם הרבה מאגרי GitHub, יכול להיות שייקח כמה דקות לטעון את הדף.
- בוחרים באפשרות
your-user-name/codelab-genaiבתור מאגר- אם המאגר לא מופיע, לוחצים על הקישור ניהול מאגרי מידע מקושרים.
- עזיבת Branch בתור
^main$ - לוחצים על Go, Node.js, Python, Java, .NET Core, Ruby או PHP באמצעות buildpacks של Google Cloud
- משאירים את השדות האחרים (
Build context directory,Entrypointו-Function target) כמו שהם.
- משאירים את השדות האחרים (
- לוחצים על שמירה.
- בוחרים באפשרות GitHub בתור ספק המאגר
- גוללים למטה אל אימות.
- לוחצים על Allow unauthenticated invocations (אפשרות הפעלה ללא אימות).
- לוחצים על יצירה.
אחרי שהגרסה תסתיים (תהליך שיימשך כמה דקות), מריצים את הפקודה הזו ונכנסים לכתובת ה-URL שמתקבלת כדי לראות את האפליקציה הפועלת:
echo -e "\n\nOnce the build finishes, visit your live application:\n \
"$( \
gcloud run services list | \
grep codelab-genai | \
awk '/URL/{print $2}' | \
head -1 \
)" \n\n"
11. שינוי הקוד
- חוזרים לטרמינל של Cloud Shell בתחתית המסך.
- מוודאים שאתם עדיין בספרייה הנכונה:
cd ~/codelab-genai - פתיחה מחדש של
main.goב-Cloud Shell Editorcloudshell edit main.go - מתקינים את Vertex AI SDK ל-Go:
go get cloud.google.com/go/vertexai/genai - כדי לקבל את מזהה הפרויקט הנוכחי, מתקינים את ספריית המטא-נתונים של Go:
go get cloud.google.com/go/compute/metadata - מחליפים את הקוד בקובץ
main.goבקוד הבא:package main import ( "context" "fmt" "log" "net/http" "os" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/vertexai/genai" ) func main() { ctx := context.Background() var projectId string var err error projectId = os.Getenv("GOOGLE_CLOUD_PROJECT") if projectId == "" { projectId, err = metadata.ProjectIDWithContext(ctx) if err != nil { return } } var client *genai.Client client, err = genai.NewClient(ctx, projectId, "us-central1") if err != nil { return } defer client.Close() model := client.GenerativeModel("gemini-1.5-flash-001") http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { animal := r.URL.Query().Get("animal") if animal == "" { animal = "dog" } resp, err := model.GenerateContent( ctx, genai.Text( fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)), ) if err != nil { w.WriteHeader(http.StatusServiceUnavailable) return } if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 { htmlContent := resp.Candidates[0].Content.Parts[0] w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, htmlContent) } }) port := os.Getenv("PORT") if port == "" { port = "8080" } if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatal(err) } }
12. פריסה מחדש
- מוודאים שאתם עדיין בספרייה הנכונה ב-Cloud Shell:
cd ~/codelab-genai - מריצים את הפקודות הבאות כדי לבצע קומיט של גרסה חדשה של האפליקציה למאגר git המקומי:
git add . git commit -m "add latest changes" - מעבירים את השינויים ל-GitHub:
git push - אחרי שהגרסה מוכנה, מריצים את הפקודה הזו ועוברים לאפליקציה שפרסתם:
echo -e "\n\nOnce the build finishes, visit your live application:\n \ "$( \ gcloud run services list | \ grep codelab-genai | \ awk '/URL/{print $2}' | \ head -1 \ )" \n\n"
יכול להיות שיחלפו כמה דקות עד שהגרסה תסתיים ותוכלו לראות את השינויים.
אפשר לראות את ההיסטוריה של כל השינויים כאן: https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions
13. (אופציונלי) בדיקת השימוש ב-Vertex AI
בדומה לשירותים אחרים של Google Cloud, אפשר לבצע ביקורת על פעולות ב-Vertex AI. יומני הביקורת מיועדים לענות על השאלות 'מי עשה מה, איפה ומתי?'. יומני הביקורת של פעילות אדמין ב-Vertex AI מופעלים כברירת מחדל. כדי לבדוק בקשות ליצירת תוכן, צריך להפעיל יומני ביקורת של גישה לנתונים:
- במסוף Google Cloud, עוברים לדף Audit Logs:
אם משתמשים בסרגל החיפוש כדי למצוא את הדף הזה, בוחרים בתוצאה שכותרת המשנה שלה היא IAM & Admin. - מוודאים שהפרויקט הקיים ב-Google Cloud הוא הפרויקט שבו אתם יוצרים את האפליקציה של Cloud Run.
- בטבלה Data Access audit logs configuration, מוצאים את האפשרות
Vertex AI APIבעמודה Service. - בכרטיסייה Log Types (סוגי יומנים), בוחרים את סוגי יומני הביקורת Data Access
Admin readו-Data read. - לוחצים על שמירה.
אחרי ההפעלה, תוכלו לראות יומני ביקורת לכל הפעלה של האפליקציה. כדי לראות את יומני הביקורת עם פרטי ההפעלה:
- חוזרים לאפליקציה שפרסתם ומרעננים את הדף כדי להפעיל את היומן.
- במסוף Google Cloud, נכנסים לדף Log Explorer:
- בחלון השאילתה מקלידים:
LOG_ID("cloudaudit.googleapis.com%2Fdata_access") protoPayload.serviceName="aiplatform.googleapis.com" - לוחצים על Run query.
ביומני ביקורת מתועד השימוש ב-Vertex AI API, אבל אי אפשר לראות בהם נתונים שקשורים לעומסי עבודה, כמו הנחיות או פרטי תשובות.
14. (אופציונלי) הגדלת יכולת הצפייה בעומס העבודה של ה-AI
יומני הביקורת לא מתעדים מידע שקשור לעומסי עבודה. כדי לשפר את יכולת הצפייה בעומסי העבודה, צריך לרשום את המידע הזה ביומן באופן מפורש. אפשר להשתמש במסגרת הרישום המועדפת כדי לעשות זאת. בשלבים הבאים מוסבר על דרך אחת לעשות זאת באמצעות ספריית רישום מובנה של Go.
- פתיחה מחדש של
main.goב-Cloud Shell Editorcloudshell edit ~/codelab-genai/main.go - משנים את בלוק הייבוא כך שיכלול את הרישום המובנה ביומן ואת ספריות ה-JSON של Go:
import ( "context" "encoding/json" "fmt" "log" "log/slog" "net/http" "os" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/vertexai/genai" ) - אחרי שמפעילים את לקוח Vertex (שורה 33), מוסיפים את השורות הבאות כדי להפעיל כלי לרישום מובנה שמשתמש בשדות הנכונים ל-Google Cloud Logging:
opts := &slog.HandlerOptions{ Level: slog.LevelDebug, ReplaceAttr: func(group []string, a slog.Attr) slog.Attr { if a.Key == slog.LevelKey { return slog.Attr{Key: "severity", Value: a.Value} } if a.Key == slog.MessageKey { return slog.Attr{Key: "message", Value: a.Value} } return slog.Attr{Key: a.Key, Value: a.Value} }, } jsonHandler := slog.NewJSONHandler(os.Stdout, opts) slog.SetDefault(slog.New(jsonHandler)) - אחרי בדיקה של תגובה ל-
GenerateContent(שורה 69), מוסיפים את השורות הבאות בתוך בלוק ה-if: הקוד הזה כותב ל-jsonBytes, err := json.Marshal(resp) if err != nil { slog.Error("Failed to marshal response to JSON", "error", err) } else { jsonString := string(jsonBytes) slog.Debug("Complete response content", "json_response", jsonString) }stdoutמידע על תוכן שנוצר באמצעות פורמט רישום מובנה ביומן. סוכן Logging ב-Cloud Run לוכד פלט שמוצג ב-stdoutוכותב את הפורמט הזה ב-Cloud Logging. - פותחים מחדש את Cloud Shell ומקלידים את הפקודה הבאה כדי לוודא שאתם בספרייה הנכונה:
cd ~/codelab-genai - שומרים את השינויים:
git commit -am "Observe generated content" - דוחפים את השינויים ל-GitHub כדי להפעיל את הפריסה מחדש של הגרסה ששונתה:
git push
אחרי פריסת הגרסה החדשה, תוכלו לראות את פרטי הניפוי באגים לגבי קריאות ל-Vertex AI.
כדי לראות את יומני האפליקציה:
- במסוף Google Cloud, נכנסים לדף Log Explorer:
- בחלון השאילתה מקלידים:
LOG_ID("run.googleapis.com%2Fstdout") severity=DEBUG - לוחצים על Run query.
תוצאת השאילתה מציגה יומנים עם הנחיה ותגובה של Vertex AI, כולל 'דירוגי בטיחות' שאפשר להשתמש בהם למעקב אחר שיטות עבודה מומלצות בנושא בטיחות
15. (אופציונלי) ניקוי
ב-Cloud Run לא מחויבים כשלא משתמשים בשירות, אבל יכול להיות שתחויבו על אחסון קובץ האימג' של הקונטיינר ב-Artifact Registry. כדי להימנע מחיובים, אפשר למחוק את הפרויקט ב-Cloud. כשמוחקים פרויקט ב-Cloud, החיוב על כל המשאבים שנעשה בהם שימוש באותו פרויקט נפסק.
אם רוצים, מוחקים את הפרויקט:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
מומלץ גם למחוק משאבים מיותרים מהדיסק של Cloud Shell. אתם יכולים:
- מוחקים את ספריית הפרויקט של ה-codelab:
rm -rf ~/codelab-genai - מנקים חבילות Go שאולי כבר לא צריך:
cd ~ go clean -modcache - אזהרה! אי אפשר לבטל את הפעולה הזו. אם רוצים למחוק את כל מה שיש ב-Cloud Shell כדי לפנות מקום, אפשר למחוק את כל ספריית הבית. חשוב לוודא שכל מה שרוצים לשמור נשמר במקום אחר.
sudo rm -rf $HOME
16. מזל טוב
במעבדה הזו כתבתם אפליקציית אינטרנט והגדרתם את Cloud Run כך שהאפליקציה תיפרס אוטומטית כשמתבצע שינוי בקוד המקור שלה. לאחר מכן שיניתם את הבקשה ופרסתם אותה שוב.
אם נהניתם מהתרגיל הזה, אתם יכולים לנסות אותו שוב בשפת תכנות או במסגרת אחרת:
אם אתם רוצים להשתתף במחקר על חוויית המשתמש (UX) כדי לעזור לנו לשפר את המוצרים שעבדתם איתם היום, אתם יכולים להירשם כאן.
ריכזנו כאן כמה אפשרויות להמשך הלמידה:
- Docs: אפשר להשתמש ב-Genkit כהפשטת מודל גמישה שמקלה על שילוב של כל API של מודל ושימוש במודלים שמתוחזקים על ידי הקהילה.
- Codelab: איך פורסים אפליקציית צ'אט מבוססת Gemini ב-Cloud Run
- איך משתמשים ב-Gemini function calling עם Cloud Run
- סדנה על פי דרישה: Google Kubernetes Engine Onboard
- איך משתמשים ב-Cloud Run Jobs Video Intelligence API כדי לעבד סרטון סצנה אחר סצנה