1. סקירה כללית
בשיעור ה-Lab הזה תיצרו את שירות התפריט של Cymbal Eats, ותחשפו ממשקי RESTful API כדי להוסיף, לעדכן, למחוק ולרשום פריטים בתפריט. תצרו מסד נתונים ב-Cloud SQL כמסד הנתונים בקצה העורפי של שירות התפריטים, שיפעל ב-Cloud Run. מכיוון ש-Cloud Run לא נמצא באותו VPC כמו מסד הנתונים של Cloud SQL, צריך להגדיר מחבר Serverless VPC Access כדי לאפשר ל-Cloud Run לתקשר עם Cloud SQL באמצעות כתובת IP פרטית.

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



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-
PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
הגדרת הסביבה
- יצירת משתני סביבה שקשורים לפרויקט ולמשאבים
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
export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
- משכפלים את המאגר ועוברים לספרייה
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- הפעלת השירותים
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. הגדרת גישה פרטית
גישה לשירותים פרטיים מסופקת כקישור בין רשתות שכנות (peering) בין רשת ה-VPC שלכם לבין רשת ה-VPC הבסיסית של Google Cloud שבה נמצא מופע Cloud SQL. החיבור הפרטי מאפשר למכונות וירטואליות ברשת ה-VPC ולשירותים שבהם אתם משתמשים לתקשר רק באמצעות כתובות IP פנימיות. כדי לגשת לשירותים שזמינים דרך גישה פרטית לשירותים, מכונות וירטואליות לא צריכות קישוריות לאינטרנט או כתובות IP חיצוניות.
- הקצאת טווח כתובות IP
gcloud compute addresses create google-managed-services-default \
--global \
--purpose=VPC_PEERING \
--prefix-length=20 \
--network=projects/$PROJECT_ID/global/networks/default
פלט לדוגמה
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
- יוצרים חיבור פרטי.
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default \
--project=$PROJECT_ID
פלט לדוגמה
Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.
4. הגדרת Cloud SQL
Cloud SQL הוא שירות מנוהל של מסד נתונים, שבעזרתו אפשר ליצור, לתחזק ולנהל מסדי נתונים רלציוניים של PostgreSQL ו-MySQL בענן. כל מכונה של Cloud SQL מופעלת על ידי מכונה וירטואלית (VM) שפועלת בשרת מארח של Google Cloud. אפשרות הזמינות הגבוהה כוללת גם מכונה וירטואלית במצב המתנה באזור אחר עם אותה הגדרה כמו המכונה הווירטואלית הראשית. מסד הנתונים נשמר במכשיר אחסון ברשת שניתן להרחבה, שמחזיק מעמד לאורך זמן ומחובר למכונת ה-VM. המכשיר הזה נקרא דיסק מתמיד (persistent disk). לכל מכונה וירטואלית מוקצית כתובת IP סטטית כדי להבטיח שכתובת ה-IP שאליה מתחברת אפליקציה תישאר קבועה במהלך חיי המכונה של Cloud SQL.

תצרו מסד נתונים של Postgres Cloud SQL עם כתובת IP פרטית.
יצירת מסד נתונים ומשתמש
- יצירת מכונה של Cloud SQL ל-Postgres לשימוש בכתובת IP פרטית
gcloud sql instances create $DB_INSTANCE_NAME \
--project=$PROJECT_ID \
--network=projects/$PROJECT_ID/global/networks/default \
--no-assign-ip \
--database-version=POSTGRES_12 \
--cpu=2 \
--memory=4GB \
--region=$REGION \
--root-password=${DB_INSTANCE_PASSWORD}
פלט לדוגמה
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance]. NAME: menu-instance DATABASE_VERSION: POSTGRES_12 LOCATION: us-east1-a TIER: db-custom-2-4096 PRIMARY_ADDRESS: - PRIVATE_ADDRESS: 10.8.80.5 STATUS: RUNNABLE
- הוספת מסד נתונים למופע של מסד נתונים
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME
פלט לדוגמה
Created database [menu-db]. instance: menu-catalog name: menu-db project: cymbal1
- יצירת משתמש SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
פלט לדוגמה
Created user [menu-user].
- אחסון כתובת ה-IP של מסד הנתונים
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- הוספת התפקיד Cloud SQL Client לחשבון השירות של Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"
פלט לדוגמה
Updated IAM policy for project [cymbal1]. [...]
5. VPC ללא שרת
גישה ל-VPC ללא שרת מאפשרת לכם להתחבר ישירות לרשת הענן הווירטואלי הפרטי (VPC) מסביבות ללא שרת, כמו Cloud Run, App Engine או Cloud Functions. הגדרת גישה לרשת VPC מאפליקציית serverless מאפשרת לסביבת ה-serverless שלכם לשלוח בקשות לרשת ה-VPC באמצעות DNS פנימי וכתובות IP פנימיות (כפי שמוגדר ב-RFC 1918 וב-RFC 6598). התשובות לבקשות האלה משתמשות גם ברשת הפנימית שלכם.
תצרו מחבר Serverless VPC Access לשירות Cloud Run כדי להתחבר ל-Cloud SQL.

- יוצרים מחבר חיבור לרשת (VPC) מאפליקציית serverless באותה רשת VPC שבה נמצאת מכונת Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
--region=${REGION} \
--range=10.8.0.0/28
פלט לדוגמה
Created connector [cymbalconnector].
6. פריסה ב-Cloud Run
תבנו ותפרסו קובץ אימג' של Docker ב-Cloud Run ותקשרו בין Cloud Run לבין מחבר ה-VPC ללא שרת כדי לגשת למסד הנתונים של Cloud SQL.
- קומפילציה של האפליקציה באמצעות Maven
./mvnw package -DskipTests
פלט לדוגמה
[...] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 42.864 s [INFO] Finished at: 2022-04-28T16:15:33Z [INFO] ------------------------------------------------------------------------
- יצירת קובץ אימג' של Docker:
docker build -f src/main/docker/Dockerfile.jvm \
--tag gcr.io/$PROJECT_NAME/menu-service .
פלט לדוגמה
[...] Successfully built 4ef5d7a3befc Successfully tagged gcr.io/cymbal1/menu-service:latest
- העברה בדחיפה של קובץ אימג' של Docker אל Container Registry:
docker push gcr.io/$PROJECT_NAME/menu-service
פלט לדוגמה
Using default tag: latest The push refers to repository [gcr.io/cymbalsql/menu-service] 17b374963800: Pushed d9a51c06430d: Pushed fff5d2a2cfc9: Pushed f21fceb558c6: Pushed 5ffbbbf218dd: Pushed 60609ec85f86: Layer already exists f2c4302f03b8: Layer already exists latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
- פריסת שירות התפריט:
gcloud run deploy $MENU_SERVICE_NAME \
--image=gcr.io/$PROJECT_NAME/menu-service:latest \
--region $REGION \
--allow-unauthenticated \
--set-env-vars DB_USER=$DB_USER \
--set-env-vars DB_PASS=$DB_PASSWORD \
--set-env-vars DB_DATABASE=$DB_DATABASE \
--set-env-vars DB_HOST=$DB_INSTANCE_IP \
--vpc-connector $SERVERLESS_VPC_CONNECTOR \
--project=$PROJECT_ID \
--quiet
פלט לדוגמה
[...] Done. Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic. Service URL: https://menu-service-g2mfphytdq-uk.a.run.app
Google ממליצה להשתמש ב-Secret Manager כדי לאחסן מידע רגיש כמו פרטי כניסה ל-SQL. אתם יכולים להעביר סודות כמשתני סביבה או לצרף אותם כנפח באמצעות Cloud Run.
- כתובת ה-URL של שירות התפריט של החנות:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- אימות כתובת ה-URL של שירות התפריט
echo $MENU_SERVICE_URL
פלט לדוגמה
https://menu-service-g2mfphytdq-uk.a.run.app
7. בדיקת השירות
- יצירת פריט תפריט חדש על ידי שליחת בקשת POST:
curl -X POST "${MENU_SERVICE_URL}/menu" \
-H 'Content-Type: application/json' \
-d '{
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!"
}'
פלט לדוגמה
{
"id": 16,
"createDateTime": "2022-04-28T18:14:04.17225",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Processing",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T18:14:04.172298"
}
- שינוי הסטטוס של פריט בתפריט על ידי שליחת בקשת PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Ready"}'
פלט לדוגמה
{
"id": 1,
"createDateTime": "2022-04-28T17:21:02.369093",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.50,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 0,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T17:21:02.657636"
}
8. מעולה!
כל הכבוד, סיימתם את ה-Codelab!
השלב הבא:
כדאי לעיין במדריכי Codelab נוספים של Cymbal Eats:
- הפעלת Cloud Workflows באמצעות Eventarc
- הפעלת עיבוד אירועים מ-Cloud Storage
- חיבור למסדי נתונים מנוהלים באופן מלא מ-Cloud Run
- אבטחת אפליקציה ללא שרת באמצעות שרת proxy לאימות זהויות (IAP)
- הפעלת משימות של Cloud Run באמצעות Cloud Scheduler
- פריסה מאובטחת ב-Cloud Run
- אבטחת תנועת נתונים נכנסת ב-Cloud Run
- התחברות ל-AlloyDB פרטי מ-GKE Autopilot
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.