התחברות ל-Cloud SQL פרטי מ-Cloud Run

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

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

19c7b05f35789fda.png

מה תלמדו

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

  • הגדרת רשת VPC פרטית
  • יצירת מסד נתונים פרטי של Postgres ב-Cloud SQL
  • חיבור של CloudRun ל-VPC פרטי
  • פריסת שירות ב-Cloud Run שמתחבר למסד הנתונים של Cloud SQL

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

הגדרת סביבה בקצב אישי

  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 ש"ח.

הגדרת סביבה

  1. יצירת משתני סביבה שקשורים לפרויקט ולמשאבים
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
  1. משכפלים את המאגר ועוברים לספרייה
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. הפעלת השירותים
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 חיצוניות.

  1. הקצאת טווח של כתובות 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].
  1. יצירת חיבור פרטי.
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.

219cb722c2dd1b82.png

אתם יוצרים מסד נתונים של Postgres Cloud SQL עם כתובת IP פרטית.

יצירת מסד נתונים ומשתמש

  1. יוצרים מכונת 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
  1. הוספת מסד נתונים למכונת מסד הנתונים
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

פלט לדוגמה

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. יצירת משתמש SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

פלט לדוגמה

Created user [menu-user].
  1. אחסון כתובת ה-IP של מסד הנתונים
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. הוספת התפקיד 'לקוח 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.

19c7b05f35789fda.png

  1. יצירת מחבר גישה ל-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.

  1. הידור האפליקציה באמצעות maven
./mvnw package -DskipTests

פלט לדוגמה

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. קובץ אימג' של 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
  1. דחיפת קובץ אימג' של 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
  1. פריסת שירות תפריט:
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.

  1. כתובת ה-URL של השירות של תפריט החנות:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. אימות כתובת ה-URL של שירות התפריט
echo $MENU_SERVICE_URL

פלט לדוגמה

https://menu-service-g2mfphytdq-uk.a.run.app

7. בדיקת השירות

  1. כדי ליצור אפשרות חדשה בתפריט, שולחים בקשת 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"
}
  1. שינוי הסטטוס של אפשרות בתפריט על ידי שליחת בקשת 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:

הסרת המשאבים

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

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

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