1. Tổng quan
Trình kết nối Cloud SQL Go là cách dễ nhất để kết nối an toàn ứng dụng Go với cơ sở dữ liệu Cloud SQL. Cloud Run là một nền tảng không máy chủ được quản lý toàn diện, cho phép bạn chạy các vùng chứa không trạng thái có thể gọi được thông qua các yêu cầu HTTP. Lớp học lập trình này sẽ minh hoạ cách kết nối một ứng dụng Go trên Cloud Run với cơ sở dữ liệu Cloud SQL for PostgreSQL một cách an toàn bằng tài khoản dịch vụ thông qua tính năng Xác thực IAM.
Kiến thức bạn sẽ học được
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện những việc sau:
- Tạo cơ sở dữ liệu Cloud SQL cho PostgreSQL
- Triển khai một ứng dụng Go lên Cloud Run
- Kết nối ứng dụng của bạn với Cloud SQL bằng Trình kết nối Go
Điều kiện tiên quyết
- Bài thực hành này giả định rằng bạn đã quen thuộc với môi trường Cloud Console và Cloud Shell.
2. Trước khi bắt đầu
Thiết lập dự án trên đám mây
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có Tài khoản Google, bạn phải tạo một tài khoản.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Thiết lập môi trường
Kích hoạt Cloud Shell bằng cách nhấp vào biểu tượng ở bên phải thanh tìm kiếm.

Trong Cloud Shell, hãy bật các API:
gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
run.googleapis.com artifactregistry.googleapis.com \
cloudbuild.googleapis.com servicenetworking.googleapis.com
Nếu được nhắc uỷ quyền, hãy nhấp vào "Uỷ quyền" để tiếp tục.

Lệnh này có thể mất vài phút để hoàn tất, nhưng cuối cùng sẽ tạo ra một thông báo thành công tương tự như thông báo này:
Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.
3. Thiết lập Tài khoản dịch vụ
Tạo và định cấu hình một tài khoản dịch vụ Google Cloud mà Cloud Run sẽ sử dụng để tài khoản đó có các quyền phù hợp để kết nối với Cloud SQL.
- Chạy lệnh
gcloud iam service-accounts createnhư sau để tạo tài khoản dịch vụ mới:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account" - Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Cloud SQL Client (Ứng dụng Cloud SQL) vào tài khoản dịch vụ Google Cloud mà bạn vừa tạo. Trong Cloud Shell, biểu thức
${GOOGLE_CLOUD_PROJECT}sẽ được thay thế bằng tên dự án của bạn. Bạn cũng có thể thay thế theo cách thủ công nếu cảm thấy thoải mái hơn.gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudsql.client" - Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Cloud SQL Instance User (Người dùng phiên bản Cloud SQL) vào tài khoản dịch vụ Google Cloud mà bạn vừa tạo.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudsql.instanceUser" - Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Log Writer (Người ghi nhật ký) vào tài khoản dịch vụ Google Cloud mà bạn vừa tạo.
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. Thiết lập Cloud SQL
Chạy lệnh gcloud sql instances create để tạo một phiên bản Cloud SQL.
- –database-version: Loại và phiên bản của công cụ cơ sở dữ liệu. Nếu bạn không chỉ định, hệ thống sẽ sử dụng chế độ mặc định của API. Hãy xem tài liệu về các phiên bản cơ sở dữ liệu gcloud để biết các phiên bản hiện có.
- –cpu: Số lượng lõi mong muốn trong máy.
- –memory: Giá trị số nguyên cho biết dung lượng bộ nhớ mong muốn trong máy. Bạn phải cung cấp một đơn vị kích thước (ví dụ: 3072 MB hoặc 9 GB). Nếu bạn không chỉ định đơn vị, thì hệ thống sẽ giả định là GB.
- –region: Vị trí theo khu vực của phiên bản (ví dụ: us-central1, asia-east1, us-east1).
- –database-flags: Cho phép đặt cờ. Trong trường hợp này, chúng ta sẽ bật
cloudsql.iam_authenticationđể cho phép Cloud Run kết nối với Cloud SQL bằng tài khoản dịch vụ mà chúng ta đã tạo trước đó.gcloud sql instances create quickstart-instance \ --database-version=POSTGRES_14 \ --cpu=1 \ --memory=4GB \ --region=us-central1 \ --database-flags=cloudsql.iam_authentication=on
Lệnh này có thể mất vài phút để hoàn tất.
Chạy lệnh gcloud sql databases create để tạo cơ sở dữ liệu Cloud SQL trong quickstart-instance.
gcloud sql databases create quickstart_db \
--instance=quickstart-instance
Tạo một người dùng cơ sở dữ liệu PostgreSQL cho tài khoản dịch vụ mà bạn đã tạo trước đó để truy cập vào cơ sở dữ liệu.
gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--instance=quickstart-instance \
--type=cloud_iam_service_account
5. Chuẩn bị đơn đăng ký
Chuẩn bị một ứng dụng Go phản hồi các yêu cầu HTTP.
- Trong Cloud Shell, hãy tạo một thư mục mới có tên là
helloworld, sau đó chuyển sang thư mục đó:mkdir helloworld cd helloworld - Chạy
go mod initđể khởi tạo một ứng dụng Go mới.go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld - Cài đặt phần phụ thuộc Cloud SQL Go Connector.
go get cloud.google.com/go/cloudsqlconn go get cloud.google.com/go/cloudsqlconn/postgres/pgxv4 - Tạo tệp
main.gobằng mã xử lý ứng dụng. Mã này có thể:- Chấp nhận yêu cầu HTTP
- Kết nối với cơ sở dữ liệu
- Lưu trữ thời gian của yêu cầu HTTP trong cơ sở dữ liệu
- Trả về thời gian của 5 yêu cầu gần đây nhất
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
Đoạn mã này tạo một máy chủ web cơ bản lắng nghe trên cổng do biến môi trường PORT xác định. Giờ đây, ứng dụng đã sẵn sàng được triển khai.
6. Triển khai ứng dụng Cloud Run
Chạy lệnh bên dưới để triển khai ứng dụng của bạn:
- –region: Vị trí theo khu vực của phiên bản (ví dụ: us-central1, asia-east1, us-east1).
- –source: Mã nguồn sẽ được triển khai. Trong trường hợp này,
.đề cập đến mã nguồn trong thư mụchelloworldhiện tại. - –set-env-vars: Thiết lập các biến môi trường mà ứng dụng dùng để chuyển hướng ứng dụng đến cơ sở dữ liệu Cloud SQL.
- –service-account: Liên kết việc triển khai Cloud Run với tài khoản dịch vụ có quyền kết nối với cơ sở dữ liệu Cloud SQL được tạo ở đầu Lớp học lập trình này.
- –allow-unauthenticated: Cho phép các yêu cầu chưa được xác thực để ứng dụng có thể truy cập được từ Internet.
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
Nếu được nhắc, hãy nhấn y và Enter để xác nhận rằng bạn muốn tiếp tục:
Do you want to continue (Y/n)? y
Sau vài phút, ứng dụng sẽ cung cấp một URL để bạn truy cập.
Chuyển đến URL để xem ứng dụng của bạn hoạt động. Mỗi khi truy cập vào URL hoặc làm mới trang, bạn sẽ thấy 5 lượt truy cập gần đây nhất được trả về dưới dạng JSON.
7. Xin chúc mừng
Bạn đã triển khai một ứng dụng Go trên Cloud Run có thể kết nối với cơ sở dữ liệu PostgreSQL đang chạy trên Cloud SQL.
Nội dung đã đề cập:
- Tạo cơ sở dữ liệu Cloud SQL cho PostgreSQL
- Triển khai ứng dụng Go lên Cloud Run
- Kết nối ứng dụng của bạn với Cloud SQL bằng Trình kết nối Go
Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên. Nếu muốn xoá toàn bộ dự án, bạn có thể chạy:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}