1. סקירה כללית
מחבר Cloud SQL Go הוא הדרך הקלה ביותר לחבר באופן מאובטח את האפליקציה Go למסד הנתונים שלכם ב-Cloud SQL. Cloud Run היא פלטפורמה מנוהלת ללא שרת (serverless), שמאפשרת להריץ קונטיינרים ללא שמירת מצב, שלא ניתנים להפעלה באמצעות בקשות HTTP. ה-Codelab הזה ידגים איך לחבר אפליקציה של Go ב-Cloud Run למסד נתונים של Cloud SQL ל-PostgreSQL בצורה מאובטחת עם חשבון שירות באמצעות אימות ב-IAM.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- יצירת מסדי נתונים של Cloud SQL ל-PostgreSQL
- פריסת אפליקציה של Go ב-Cloud Run
- חיבור האפליקציה ל-Cloud SQL באמצעות Go Connector
דרישות מוקדמות
- שיעור ה-Lab הזה מבוסס על היכרות עם הסביבות של Cloud Console ו-Cloud Shell.
2. לפני שמתחילים
הגדרת פרויקט ב-Cloud
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם עדיין אין לכם חשבון Google, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
- Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט. - לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הגדרת סביבה
לוחצים על הסמל שמופיע מימין לסרגל החיפוש כדי להפעיל את Cloud Shell.
ב-Cloud Shell, מפעילים את ממשקי ה-API:
gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
run.googleapis.com artifactregistry.googleapis.com \
cloudbuild.googleapis.com servicenetworking.googleapis.com
אם מתבקשים לאשר, לוחצים על 'הרשאה' כדי להמשיך.
השלמת הפקודה תימשך כמה דקות, אבל בסופו של דבר היא אמורה להניב הודעה מוצלחת שדומה לזו:
Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.
3. הגדרה של חשבון שירות
יצירה והגדרה של חשבון שירות של Google Cloud שישמש את Cloud Run, כדי שיהיו לו ההרשאות המתאימות להתחבר ל-Cloud SQL.
- כדי ליצור חשבון שירות חדש, מריצים את הפקודה
gcloud iam service-accounts create
באופן הבא:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account"
- מריצים את הפקודה add-iam-policy-binding לפרויקטים של gcloud כדי להוסיף את התפקיד לקוח Cloud SQL לחשבון השירות ב-Google Cloud שיצרתם. ב-Cloud Shell, הביטוי
${GOOGLE_CLOUD_PROJECT}
יוחלף בשם הפרויקט שלכם. אפשר גם לבצע את ההחלפה הזו באופן ידני אם נראה לך מתאים יותר.gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudsql.client"
- מריצים את הפקודה add-iam-policy-binding לפרויקטים של gcloud כדי להוסיף את התפקיד Cloud SQL Instance User לחשבון השירות ב-Google Cloud שיצרתם.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudsql.instanceUser"
- מריצים את הפקודה add-iam-policy-binding של פרויקטים ב-gcloud באופן הבא, כדי להוסיף את התפקיד Log Writer לחשבון השירות ב-Google Cloud שיצרתם.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
4. הגדרת Cloud SQL
כדי ליצור מכונה של Cloud SQL, מריצים את הפקודה gcloud sql instances create
.
- –database-version: הסוג והגרסה של המנוע של מסד הנתונים. אם לא צוין ערך, ייעשה שימוש בברירת המחדל של ה-API. במסמכי התיעוד בנושא גרסאות של מסד הנתונים של gcloud אפשר לראות את הגרסאות הקיימות של מסד הנתונים.
- –cpu: מספר הליבות שרוצים במכונה.
- –זיכרון: מספר שלם שמציין כמה זיכרון רוצים לקבל במכונה. צריך לספק יחידת גודל (לדוגמה, 3072MB או 9GB). אם לא צוינו יחידות, ההנחה היא GB.
- –region: המיקום האזורי של המכונה (לדוגמה: us-central1, asia-east1, us-east1).
- –database-flags: המדיניות מאפשרת להגדיר דגלים. במקרה זה, אנחנו מפעילים את
cloudsql.iam_authentication
כדי לאפשר ל-Cloud Run להתחבר ל-Cloud SQL באמצעות חשבון השירות שיצרנו בעבר.gcloud sql instances create quickstart-instance \ --database-version=POSTGRES_14 \ --cpu=1 \ --memory=4GB \ --region=us-central1 \ --database-flags=cloudsql.iam_authentication=on
השלמת הפקודה תימשך כמה דקות.
מריצים את הפקודה gcloud sql databases create
כדי ליצור מסד נתונים ב-Cloud SQL בתוך quickstart-instance
.
gcloud sql databases create quickstart_db \
--instance=quickstart-instance
כדי לגשת למסד הנתונים, יוצרים משתמש במסד הנתונים של PostgreSQL עבור חשבון השירות שיצרתם קודם.
gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--instance=quickstart-instance \
--type=cloud_iam_service_account
5. הכנת הבקשה
מכינים אפליקציה ב-Go שמגיבה לבקשות HTTP.
- יוצרים ספרייה חדשה ב-Cloud Shell בשם
helloworld
ואז עוברים אליה:mkdir helloworld cd helloworld
- מריצים את הפקודה
go mod init
כדי לאתחל אפליקציה חדשה ב-Go.go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld
- מתקינים את התלות ב-Cloud SQL Go Connector.
go get cloud.google.com/go/cloudsqlconn go get cloud.google.com/go/cloudsqlconn/postgres/pgxv4
- יוצרים קובץ
main.go
עם קוד האפליקציה. הקוד הזה יכול:- אישור בקשות HTTP
- חיבור למסד הנתונים
- אחסון השעה של בקשת ה-HTTP במסד הנתונים
- החזרת השעות של חמש הבקשות האחרונות
cat > main.go << "EOF" package main import ( "database/sql" "encoding/json" "fmt" "log" "net/http" "os" "time" "cloud.google.com/go/cloudsqlconn" "cloud.google.com/go/cloudsqlconn/postgres/pgxv4" ) // visitData is used to pass data to the HTML template. type visitData struct { RecentVisits []visit } // visit contains a single row from the visits table in the database. // Each visit includes a timestamp. type visit struct { VisitTime time.Time } // getDB creates a connection to the database // based on environment variables. func getDB() (*sql.DB, func() error) { cleanup, err := pgxv4.RegisterDriver("cloudsql-postgres", cloudsqlconn.WithIAMAuthN()) if err != nil { log.Fatalf("Error on pgxv4.RegisterDriver: %v", err) } dsn := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", os.Getenv("INSTANCE_CONNECTION_NAME"), os.Getenv("DB_USER"), os.Getenv("DB_NAME")) db, err := sql.Open("cloudsql-postgres", dsn) if err != nil { log.Fatalf("Error on sql.Open: %v", err) } createVisits := `CREATE TABLE IF NOT EXISTS visits ( id SERIAL NOT NULL, created_at timestamp NOT NULL, PRIMARY KEY (id) );` _, err = db.Exec(createVisits) if err != nil { log.Fatalf("unable to create table: %s", err) } return db, cleanup } func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } log.Printf("Listening on port %s", port) db, cleanup := getDB() defer cleanup() http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { // Insert current visit _, err := db.Exec("INSERT INTO visits(created_at) VALUES(NOW())") if err != nil { log.Fatalf("unable to save visit: %v", err) } // Get the last 5 visits rows, err := db.Query("SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5") if err != nil { log.Fatalf("DB.Query: %v", err) } defer rows.Close() var visits []visit for rows.Next() { var visitTime time.Time err := rows.Scan(&visitTime) if err != nil { log.Fatalf("Rows.Scan: %v", err) } visits = append(visits, visit{VisitTime: visitTime}) } response, err := json.Marshal(visitData{RecentVisits: visits}) if err != nil { log.Fatalf("renderIndex: failed to parse totals with json.Marshal: %v", err) } w.Write(response) }) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatal(err) } } EOF
הקוד הזה יוצר שרת אינטרנט בסיסי שמאזין ליציאה שהוגדרה על ידי משתנה הסביבה PORT. האפליקציה מוכנה עכשיו לפריסה.
6. פריסת אפליקציית Cloud Run
מריצים את הפקודה הבאה כדי לפרוס את האפליקציה:
- –region: המיקום האזורי של המכונה (לדוגמה: us-central1, asia-east1, us-east1).
- –source: קוד המקור לפריסה. במקרה הזה, הערך
.
מתייחס לקוד המקור שנמצא בתיקייה הנוכחיתhelloworld
. - –set-env-vars: מגדיר משתני סביבה שהאפליקציה משתמשת בהם כדי להפנות את האפליקציה למסד הנתונים של Cloud SQL.
- –service-account: קישור הפריסה של Cloud Run לחשבון השירות עם הרשאות להתחברות למסד הנתונים של Cloud SQL שנוצר בתחילת ה-Codelab הזה.
- –allow-unauthenticated: מאפשר בקשות לא מאומתות כדי שאפשר יהיה לגשת לאפליקציה מהאינטרנט.
gcloud run deploy helloworld \
--region=us-central1 \
--source=. \
--set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
--set-env-vars DB_NAME="quickstart_db" \
--set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
--service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--allow-unauthenticated
אם מתבקשים להמשיך, לוחצים על y
ועל Enter
כדי לאשר את המשך הפעולה:
Do you want to continue (Y/n)? y
לאחר כמה דקות, האפליקציה אמורה לספק כתובת URL שתוכלו לבקר בה.
צריך לעבור אל כתובת ה-URL כדי לראות את האפליקציה בפעולה. בכל פעם שתיכנסו לכתובת ה-URL או תרעננו את הדף, תראו את חמשת הביקורים האחרונים האחרונים שמוחזרים כ-JSON.
7. מזל טוב
פרסתם אפליקציית Go ב-Cloud Run שיכולה להתחבר למסד נתונים של PostgreSQL על Cloud SQL.
נושאים שטיפלנו בהם:
- יצירת מסד נתונים של Cloud SQL ל-PostgreSQL
- פריסת אפליקציה של Go ב-Cloud Run
- חיבור האפליקציה ל-Cloud SQL באמצעות Go Connector
הסרת המשאבים
כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שנעשה בהם שימוש במדריך הזה, צריך למחוק את הפרויקט שמכיל את המשאבים או לשמור את הפרויקט ולמחוק את המשאבים הספציפיים. כדי למחוק את הפרויקט כולו, אפשר להריץ את הפקודה:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}