1. Tổng quan
Trình kết nối Cloud SQL Node.js là cách dễ nhất để kết nối an toàn ứng dụng Node.js 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ý hoàn toàn, cho phép bạn chạy các vùng chứa không có trạng thái có thể gọi 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 an toàn một ứng dụng Node.js trên Cloud Run với một cơ sở dữ liệu Cloud SQL cho PostgreSQL với một tài khoản dịch vụ sử dụng phương thức 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 một thực thể Cloud SQL cho cơ sở dữ liệu PostgreSQL
- Triển khai ứng dụng Node.js cho Cloud Run
- Kết nối ứng dụng với cơ sở dữ liệu bằng thư viện Trình kết nối Node.js của Cloud SQL
Điều kiện tiên quyết
- Phòng thí nghiệm 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 Cloud
- Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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ự không được API của Google 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à duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. 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 (mã này thường được xác định là
PROJECT_ID
). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án. - Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
- Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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í 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 cho phép, 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 rồi sẽ tạo ra một thông báo thành công tương tự như lệnh 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 tài khoản dịch vụ Google Cloud mà Cloud Run sử dụng để có quyền kết nối phù hợp với Cloud SQL.
- Chạy lệnh
gcloud iam service-accounts create
như sau để tạo một 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 add-iam-policy-binding trong dự án gcloud như sau để thêm vai trò Ứ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ể tự thay thế nếu 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 add-iam-policy-binding trong dự án gcloud như sau để thêm vai trò 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 add-iam-policy-binding trong dự án gcloud như sau để thêm vai trò Người ghi nhật ký vào tài khoản dịch vụ Google Cloud 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ông cụ cơ sở dữ liệu. Nếu bạn không chỉ định, API mặc định sẽ được sử dụng. 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õi mong muốn trong máy.
- –memory: Giá trị số nguyên cho biết dung lượng bộ nhớ mà máy cần có. Bạn phải cung cấp đơn vị kích thước (ví dụ: 3072 MB hoặc 9 GB). Nếu không có đơn vị nào được chỉ định, GB được giả định.
- –region: Vị trí theo khu vực của thực thể (ví dụ: us-central1, asia-east1, us-east1).
- –database-flags: Cho phép thiết lập 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 đây.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ị ứng dụng Node.js để 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 đó thay đổi thành thư mục đó:mkdir helloworld cd helloworld
- Khởi động tệp
package.json
dưới dạng một mô-đun.npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs"
- Cài đặt phần phụ thuộc trình kết nối Cloud SQL Node.js.
npm install @google-cloud/cloud-sql-connector
- Cài đặt
pg
để tương tác với cơ sở dữ liệu PostgreSQL.npm install pg
- Cài đặt express để chấp nhận các yêu cầu http đến.
npm install express
- Tạo tệp
index.mjs
có 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 năm yêu cầu gần đây nhất
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; import {Connector} from '@google-cloud/cloud-sql-connector'; const {Pool} = pg; const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME, authType: 'IAM' }); const pool = new Pool({ ...clientOpts, user: process.env.DB_USER, database: process.env.DB_NAME }); const app = express(); app.get('/', async (req, res) => { await pool.query('INSERT INTO visits(created_at) VALUES(NOW())'); const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5'); console.table(rows); // prints the last 5 visits res.send(rows); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, async () => { console.log('process.env: ', process.env); await pool.query(`CREATE TABLE IF NOT EXISTS visits ( id SERIAL NOT NULL, created_at timestamp NOT NULL, PRIMARY KEY (id) );`); console.log(`helloworld: listening on port ${port}`); }); EOF
Mã này tạo một máy chủ web cơ bản tiếp nhận trên cổng được xác định bởi biến môi trường PORT. Bây giờ, ứng dụng đã sẵn sàng để được triển khai.
6. Triển khai ứng dụng Cloud Run
Chạy lệnh dưới đây để triển khai ứng dụng của bạn lên Cloud Run:
- –region: Vị trí theo khu vực của thực thể (ví dụ: us-central1, asia-east1, us-east1).
- –source: Mã nguồn sẽ được triển khai. Trong trường hợp này,
.
tham chiếu đến mã nguồn trong thư mục hiện tạihelloworld
. - –set-env-vars: Đặt 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 quy trình triển khai Cloud Run với tài khoản dịch vụ bằng cá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.
- –cho phép chưa xác thực: Cho phép các yêu cầu chưa được xác thực để có thể truy cập ứng dụng 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 URL để bạn truy cập.
Điều hướng đến URL để xem ứng dụng của bạn hoạt động. Mỗi lần 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 Node.js trên Cloud Run có khả năng kết nối với cơ sở dữ liệu PostgreSQL chạy trên Cloud SQL.
Nội dung chúng ta đã đề cập:
- Tạo cơ sở dữ liệu Cloud SQL cho PostgreSQL
- Triển khai ứng dụng Node.js trê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 Node.js của Cloud SQL
Dọn dẹp
Để tránh làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, hãy xoá dự án chứa các tài nguyên đó, hoặc giữ lại dự án và xoá từng tài nguyên riêng lẻ. Nếu muốn xoá toàn bộ dự án, bạn có thể chạy:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}