1. סקירה כללית
בשיעור ה-Lab הזה תיצרו את שירות התפריט Cymbal Eats, ותחשוף ממשקי API בארכיטקטורת RESTful לצורך הוספה, עדכון, מחיקה והצגה של פריטים בתפריט. ניצור מסד נתונים ב-Cloud SQL כמסד הנתונים לקצה העורפי של שירות התפריטים, שיופעל ב-Cloud Run. מכיוון ש-Cloud Run לא נמצא באותו VPC כמו מסד הנתונים של Cloud SQL, תצטרכו להגדיר מחבר VPC Access ללא שרת (serverless) כדי לאפשר ל-Cloud Run לתקשר עם Cloud SQL באמצעות כתובת IP פרטית.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- הגדרת רשת VPC פרטית
- יצירת מסד נתונים פרטי של Postgres ב-Cloud SQL
- חיבור של CloudRun ל-VPC פרטי
- פריסת שירות ב-Cloud Run שמתחבר למסד הנתונים של Cloud SQL
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
- Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט. - לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הגדרת סביבה
- יצירת משתני סביבה שקשורים לפרויקט ולמשאבים
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 VPC הבסיסית שבה נמצאת המכונה של 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)', שמחובר ל-VM. כתובת IP סטטית מוקצית לכל מכונה וירטואלית כדי להבטיח שכתובת ה-IP שאליה האפליקציה מתחברת תישאר קבועה במהלך חיי המכונה של Cloud SQL.
אתם יוצרים מסד נתונים של Postgres Cloud SQL עם כתובת IP פרטית.
יצירת מסד נתונים ומשתמש
- יוצרים מכונת Postgres Cloud SQL כדי להשתמש בכתובת 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' לחשבון השירות של 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 ללא שרת (serverless)
גישה ל-VPC ללא שרת (serverless) מאפשרת לכם להתחבר ישירות לרשת ענן וירטואלי פרטי (VPC) מסביבות ללא שרת (serverless), כמו Cloud Run, App Engine או Cloud Functions. הגדרה של גישה ל-VPC ללא שרת (serverless) מאפשרת לסביבה ללא שרת (serverless) לשלוח בקשות לרשת ה-VPC באמצעות כתובות DNS פנימיות וכתובות IP פנימיות (כפי שהוגדרו על ידי RFC 1918 ו-RFC 6598). התגובות לבקשות האלה גם משתמשות ברשת הפנימית שלכם.
יוצרים מחבר גישה ל-VPC ללא שרת (serverless) כדי ששירות 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 ללא שרת (serverless) כדי לגשת למסד הנתונים של 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 למרשם קונטיינרים:
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!
השלב הבא:
בקישורים הבאים תוכלו למצוא עוד מעבדי קוד Labs של Cymbal Eats:
- הפעלת Cloud Workflows באמצעות Eventarc
- הפעלת עיבוד אירועים מ-Cloud Storage
- התחברות למסדי נתונים מנוהלים מ-Cloud Run
- אפליקציה מאובטחת ללא שרת (serverless) עם שרת proxy לאימות זהויות (IAP)
- הפעלת משימות של Cloud Run באמצעות Cloud Scheduler
- פריסה מאובטחת ב-Cloud Run
- אבטחת תעבורת נתונים נכנסת (ingress) ב-Cloud Run
- התחברות מ-GKE Autopilot אל אפליקציה פרטית מסוג AlloyDB
הסרת המשאבים
כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שנעשה בהם שימוש במדריך הזה, צריך למחוק את הפרויקט שמכיל את המשאבים או לשמור את הפרויקט ולמחוק את המשאבים הספציפיים.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.