התחברות ל-Cloud SQL: Compute Engine, IP פרטי ו-Cloud SQL Proxy

1. מבוא

עדכון אחרון:6 במאי 2021

חשיבה על החיבור

יש הרבה סוגים של אפליקציות ו-frameworks. בשיעור ה-Codelab הזה נלמד על התחברות ל-Cloud SQL מאפליקציה שמופעלת במכונה וירטואלית מנוהלת ב-Google Compute Engine, דרך כתובת IP פרטית פנימית באמצעות שרת ה-proxy של Cloud SQL. זוהי דרך מאובטחת להפליא להריץ אפליקציה עם שמירת מצב בענן. אתם מצמצמים את החשיפה שלכם לאינטרנט על ידי הגבלה לשימוש בכתובת IP פרטית בלבד, ושימוש בשרת proxy של SQL שמטפל עבורכם בקישוריות SSL.

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

מה תפַתחו

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

ההוראות יכללו גם הדרכה מפורטת לביצוע פעולות במסוף GCP, וגם את הפקודה המקבילה של gcloud לשימוש ב-CLI או באוטומציה.

השלבים הנפרדים הם:

  • יצירת חשבון שירות מינימלי כדי לאפשר חיבור למכונה של Cloud SQL
  • יצירת מכונה וירטואלית ב-Google Compute Engine (GCE)
  • יצירת מכונה של Cloud SQL (המדריך הזה משתמש ב-Postgres, אבל הוא פועל באופן דומה ב-MySQL או בשרת SQL)
  • הורדה והפעלה של ה-Proxy ל-Cloud SQL במכונה של GCE

מה צריך להכין

  • חשבון GCP שיש לך בו הרשאות להפעלת ממשקי API וליצירת שירותים

2. יצירה של חשבון שירות

חשבונות שירות משמשים להענקת הרשאות לשימוש בשירותים שונים בפרויקט GCP. ב-Codelab הזה אנחנו זקוקים כדי לקבל הרשאה ל-Cloud SQL Proxy להתחבר למכונה של Cloud SQL.

במסוף

נכנסים לדף של חשבונות השירות של IAM ולוחצים על הלחצן f8393a08b37a422c.png בחלק העליון של הדף.

נותנים לחשבון השירות שם ומזהה ייחודיים ולוחצים על CREATE (יצירה).

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

לוחצים על 'סיום'.

באמצעות gcloud

יוצרים את חשבון השירות:

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

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

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

לדוגמה אם יצרתם את חשבון השירות והוא נקרא sa-test, והפרויקט שלכם הוא my-project-test, הפקודה תהיה:

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. יצירת המכונה הווירטואלית (VM) של Compute Engine

Google Compute Engine הוא השירות המנוהל שבו תפעל המכונה הווירטואלית שתכיל את האפליקציה שממנה אנחנו רוצים להתחבר. ב-Codelab הזה אנחנו לא בונים אפליקציה, אבל נאשר את הקישוריות על ידי הרצת psql.

במסוף

נכנסים לדף Google Compute Engine ולוחצים על הלחצן 77c46cd1f51bed5c.png.

יש כאן הרבה אפשרויות, ומה שצריך לעשות הוא רק:

  1. נותנים שם למכונה.
  2. שינוי Machine type לf1-micro
  3. בקטע 'גישה לזהות ול-API', משנים את התפריט הנפתח של Service account במקום Default compute service account בתפריט שיצרתם בשלב הקודם.
  4. לוחצים על 'יצירה מלאה' בחלק התחתון של הדף

באמצעות gcloud

חשבון השירות הוא השם המלא של חשבון השירות שיצרתם קודם, ולכן הוא יהיה בפורמט: <NAME>@<PROJECT>.iam.gserviceaccount.com.

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. יצירת המכונה של Cloud SQL

Cloud SQL הוא ההצעה של מסדי הנתונים הרלציוניים המנוהלים שלנו. הוא תומך ב-MySQL, PostgreSQL ושרת SQL. לצורך ה-codelab הזה ניצור מסד נתונים של Postgres, אבל ההוראות זהות בכל השלושה.

במסוף

נכנסים לדף Cloud SQL ולוחצים על הלחצן 241836b315e11bf5.png.

כמו שציינתי, רוב ה-Codelab הזה הוא גנרי לכל טעם של SQL, אבל ב-Codelab הזה צריך לבחור ב-PostgreSQL.

  1. צריך להזין מזהה למכונה
  2. צריך להזין סיסמה למשתמש שמוגדר כברירת המחדל (שם המשתמש יוגדר כברירת מחדל ל-DB שנבחר, למשל root ל-MySQL או postgres ל-PostgreSQL)
  3. אם שיניתם את האזור של מופע המחשוב, עליכם לשנות גם את האזור כאן בהתאם.
  4. גוללים למטה ולוחצים על show configuration options.
  5. הרחבת הקטע 'Connectivity'
  6. מבטלים את הסימון של האפשרות Public IP ומסמנים את התיבה Private IP
  7. צריך לוודא שהאפשרות default נבחרה בתפריט הנפתח שמופיע כשנבדקה כתובת ה-IP הפרטית
  8. גוללים למטה ולוחצים על 'יצירה'.

בדרך כלל לוקח כמה דקות להתחיל במכונה.

באמצעות gcloud

אין לנו הנחיות נעימות להפעלת ממשקי API מכאן, נצטרך לעשות זאת באופן ידני

gcloud services enable servicenetworking.googleapis.com

לאחר מכן, צריך להפעיל קישוריות שירות פרטי ברשת ה-VPC שמוגדרת כברירת מחדל. הדבר הראשון שצריך לעשות הוא להקצות טווח של כתובות IP בעלות שם שישמש למכונה שלנו.

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

בשלב הבא נקצה את הטווח של כתובות ה-IP לשירותים הפנימיים שלנו (התהליך נמשך כדקה).

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

לסיום, יצירת המכונה עצמה זמינה כרגע רק בגרסת הבטא. השילוב של --no-assign-ip ו---network=default הוא מה שמאפשר קישוריות IP פרטית. נכון לעכשיו, אין דרך להפעיל גם כתובת IP פרטית וגם כתובת IP ציבורית בו-זמנית. לכן אם נדרשת לכם גישה ציבורית, צריך לערוך את המופע אחרי היצירה. הפעולה הזאת עשויה להימשך כמה דקות.

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. הגדרה והפעלה של שרת Proxy ל-Cloud SQL

אחרי החיבור למכונה הווירטואלית יהיה צורך במחרוזת חיבור של מכונה. קודם נשלוף אותו ואז נחבר למכונה הווירטואלית עצמה באמצעות SSH. ההוראות לחלקים האלה יופיעו בקטעים המתאימים ב-Console לעומת gcloud, ולאחר מכן שאר הפקודות יהיו פקודות שרצות מהמעטפת של המכונה הווירטואלית בקטע נפרד.

במסוף

נכנסים לכאן ולוחצים על שם המכונה של Cloud SQL.

גוללים קצת למטה ומעתיקים את Connection name למקום כלשהו לשימוש מאוחר יותר.

נכנסים לדף רשימת המכונות של Google Compute Engine ומחפשים את השורה עם המכונה הווירטואלית.

בעמודה Connect, לוחצים על הלחצן SSH. ייפתח חלון נפרד שיתחבר באופן מאובטח למכונה הווירטואלית.

אפשר לדלג על הקטע Using gcloud כדי לראות את שאר ההוראות כי הן זהות בשניהם.

באמצעות gcloud

מחליפים את <INSTANCE NAME> בשם של המכונה של Cloud SQL:

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

שומרים את שם החיבור של המכונה לשימוש מאוחר יותר.

צריך להחליף את <ZONE> באזור שהיה בשימוש כשיצרתם את המכונה. אם לא שינית אותה, אז היא הוגדרה לערך us-central1-b. וגם מחליפים את <INSTANCE_NAME> עם מה שציינת קודם.

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

אחרי ההתחברות ל-VM

קודם כל, צריך להוריד את שרת ה-proxy. בהתאם למערכת ההפעלה. אם לא שיניתם את מערכת ההפעלה במהלך היצירה של ה-VM, מדובר ב-Linux. אתם יכולים להשתמש בפקודה הבאה:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

אם החלפתם את מערכת ההפעלה, תוכלו להיכנס לכאן כדי למצוא את הפקודה המתאימה להורדת שרת ה-proxy למערכת ההפעלה.

כדי להריץ את שרת ה-proxy, משתמשים בשם החיבור של המכונה שהעתקתם מפרטי המכונה של Cloud SQL כדי להחליף את <INSTANCE_CONNECTION_NAME>. כמו כן, מספר יציאת ה-tcp עשוי להשתנות אם לא משתמשים ב-Postgres db, או אם משנים את יציאת ברירת המחדל שבה ה-Db מאזין.

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. בדיקת החיבור וסיכום

כפי שצוין קודם, אם יש לך אפליקציה שברצונך להפעיל במכונה של GCE כדי לבדוק אותה, זה בסדר גמור. לצורך ה-Codelab הזה, נתקין את psql ונשתמש בלקוח הזה כדי לאמת שאנחנו יכולים להתחבר למסד הנתונים שלנו.

מסשן ה-SSH ב-VM:

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

לאחר מכן מציינים את סיסמת המשתמש כברירת מחדל שהגדרתם כשיצרתם את המכונה של Cloud SQL.

מעולה! אם הכול נראה בסדר, אמורה להופיע ההנחיה של Postgres והרצת פקודות על מסד הנתונים שלכם.

מה השלב הבא?

כדאי לנסות כמה מ-Codelabs האלה...

מסמכי עזר