1. ภาพรวม
เครื่องมือเชื่อมต่อ Go ของ Cloud SQL เป็นวิธีที่ง่ายที่สุดในการเชื่อมต่อแอปพลิเคชัน Go กับฐานข้อมูล Cloud SQL อย่างปลอดภัย Cloud Run เป็นแพลตฟอร์มแบบ Serverless ที่มีการจัดการครบวงจรซึ่งช่วยให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคำขอ HTTP ได้ Codelab นี้จะสาธิตวิธีเชื่อมต่อแอปพลิเคชัน Go ใน Cloud Run กับฐานข้อมูล Cloud SQL สำหรับ PostgreSQL อย่างปลอดภัยด้วยบัญชีบริการโดยใช้การตรวจสอบสิทธิ์ IAM
สิ่งที่คุณจะได้เรียนรู้
ในแล็บนี้ คุณจะได้เรียนรู้วิธีทำสิ่งต่อไปนี้
- สร้างฐานข้อมูล Cloud SQL สำหรับ PostgreSQL
- ทำให้แอปพลิเคชัน Go ใช้งานได้ใน Cloud Run
- เชื่อมต่อแอปพลิเคชันกับ Cloud SQL โดยใช้ตัวเชื่อมต่อ Go
ข้อกำหนดเบื้องต้น
- แล็บนี้มีสมมติฐานว่าคุณคุ้นเคยกับสภาพแวดล้อมของ Cloud Console และ Cloud Shell
2. ก่อนเริ่มต้น
การตั้งค่าโปรเจ็กต์ Cloud
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Google คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
การตั้งค่าสภาพแวดล้อม
เปิดใช้งาน Cloud Shell โดยคลิกไอคอนทางด้านขวาของแถบค้นหา

เปิดใช้ API จาก Cloud Shell โดยทำดังนี้
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" - เรียกใช้คำสั่ง gcloud projects add-iam-policy-binding ดังนี้เพื่อเพิ่มบทบาทไคลเอ็นต์ 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" - เรียกใช้คำสั่ง gcloud projects add-iam-policy-binding ดังนี้เพื่อเพิ่มบทบาทผู้ใช้อินสแตนซ์ Cloud SQL ให้กับบัญชีบริการ 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" - เรียกใช้คำสั่ง gcloud projects add-iam-policy-binding ดังนี้เพื่อเพิ่มบทบาทผู้เขียนบันทึกไปยังบัญชีบริการ 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
เรียกใช้คำสั่ง gcloud sql instances create เพื่อสร้างอินสแตนซ์ Cloud SQL
- -database-version: ประเภทและเวอร์ชันของเครื่องมือฐานข้อมูล หากไม่ได้ระบุ ระบบจะใช้ค่าเริ่มต้นของ API ดูเวอร์ชันที่พร้อมใช้งานในปัจจุบันได้ที่เอกสารประกอบเกี่ยวกับเวอร์ชันฐานข้อมูล gcloud
- -cpu: จำนวนคอร์ที่ต้องการในเครื่อง
- -memory: ค่าจำนวนเต็มที่ระบุปริมาณหน่วยความจำที่ต้องการในเครื่อง ควรระบุหน่วยขนาด (เช่น 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
- สร้างไดเรกทอรีใหม่ชื่อ
helloworldใน Cloud Shell แล้วเปลี่ยนไปที่ไดเรกทอรีนั้น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 ในฐานข้อมูล
- แสดงเวลาของคำขอ 5 รายการล่าสุด
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
โค้ดนี้จะสร้างเว็บเซิร์ฟเวอร์พื้นฐานที่รอฟังพอร์ตซึ่งกำหนดโดยตัวแปรสภาพแวดล้อมของพอร์ต ตอนนี้แอปพลิเคชันพร้อมใช้งานแล้ว
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 หรือรีเฟรชหน้าเว็บ คุณจะเห็นการเข้าชม 5 ครั้งล่าสุดที่แสดงเป็น 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}