1. Tổng quan
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 Node.js trên Cloud Run với AlloyDB một cách an toàn bằng tài khoản dịch vụ thông qua 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:
- Tạo một thực thể AlloyDB (được định cấu hình để sử dụng Private Service Connect)
- Triển khai một ứng dụng lên Cloud Run để kết nối với phiên bản AlloyDB
2. Điều kiện tiên quyết
- Nếu chưa có Tài khoản Google, bạn phải tạo một Tài khoản Google.
- Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp. Tài khoản do nơi làm việc hoặc trường học cấp có thể có những hạn chế khiến bạn không thể bật các API cần thiết cho lớp học này.
3. Thiết lập dự án
- Đăng nhập vào Google Cloud Console.
- Bật tính năng thanh toán trong Bảng điều khiển Cloud.
- Việc hoàn thành bài tập thực hành này sẽ tốn ít hơn 1 USD cho các tài nguyên trên Cloud.
- Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
- Người dùng mới đủ điều kiện dùng thử miễn phí 300 USD.
- Tạo dự án mới hoặc chọn sử dụng lại một dự án hiện có.
4. Mở Trình chỉnh sửa Cloud Shell
- Chuyển đến Trình chỉnh sửa Cloud Shell
- Nếu thiết bị đầu cuối không xuất hiện ở cuối màn hình, hãy mở thiết bị đầu cuối:
- Nhấp vào trình đơn có biểu tượng ba dấu gạch ngang

- Nhấp vào Terminal (Thiết bị đầu cuối)
- Nhấp vào Thiết bị đầu cuối mới

- Nhấp vào trình đơn có biểu tượng ba dấu gạch ngang
- Trong thiết bị đầu cuối, hãy thiết lập dự án bằng lệnh sau:
- Định dạng:
gcloud config set project [PROJECT_ID] - Ví dụ:
gcloud config set project lab-project-id-example - Nếu bạn không nhớ mã dự án của mình, hãy làm như sau:
- Bạn có thể liệt kê tất cả mã dự án bằng cách dùng lệnh:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

- Bạn có thể liệt kê tất cả mã dự án bằng cách dùng lệnh:
- Định dạng:
- Nếu được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục.

- Bạn sẽ thấy thông báo sau:
Nếu thấy biểu tượngUpdated property [core/project].
WARNINGvà được yêu cầuDo you want to continue (Y/N)?, thì có thể bạn đã nhập sai mã dự án. NhấnN, nhấnEnterrồi thử chạy lại lệnhgcloud config set project.
5. Bật API
Trong dòng lệnh, hãy bật các API:
gcloud services enable \
compute.googleapis.com \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.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-73d90d00-47ee-447a-b600" finished successfully.
6. 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ẽ dùng để đảm bảo tài khoản đó có các quyền phù hợp để kết nối với AlloyDB.
- 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ò AlloyDB Database User (Người dùng cơ sở dữ liệu AlloyDB) 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/alloydb.databaseUser" - Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Service Usage Consumer (Người tiêu dùng sử dụng dịch vụ) 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/serviceusage.serviceUsageConsumer" - 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"
7. Tạo cơ sở dữ liệu AlloyDB
- Chạy lệnh
gcloud alloydb clusters createđể tạo một phiên bản Cloud SQLgcloud alloydb clusters create quickstart-cluster \ --password=$(openssl rand -base64 20) \ --region=us-central1 \ --project=${GOOGLE_CLOUD_PROJECT} \ --enable-private-service-connect \ --database-version=POSTGRES_16
Lệnh này có thể mất vài phút để hoàn tất.
- Chạy lệnh
gcloud alloydb instances createđể tạo một phiên bản Cloud SQLgcloud alloydb instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=us-central1 \ --cluster=quickstart-cluster \ --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \ --database-flags=alloydb.iam_authentication=on - Chạy lệnh
gcloud alloydb instances describeđể lấy đường liên kết đính kèm dịch vụ PSC và xuất đường liên kết đó sang một biếnexport SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \ --cluster=quickstart-cluster --region=us-central1 \ --format="value(pscInstanceConfig.serviceAttachmentLink)") gcloud compute addresses create quickstart-address \ --region=us-central1 \ --subnet=defaultgcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
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 alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
8. Chuẩn bị đơn đăng ký
Chuẩn bị một ứ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 đó chuyển sang thư mục đó:mkdir helloworld cd helloworld - Khởi tạo tệp
package.jsondướ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 thư viện Google Cloud Auth.
npm install google-auth-library - 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 một tệp
index.mjscó 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 > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; import {GoogleAuth} from 'google-auth-library'; const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/alloydb.login'], }); const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: async () => { return await auth.getAccessToken(); }, database: process.env.DB_NAME, ssl: { require: true, rejectUnauthorized: false, // required for self-signed certs // https://node-postgres.com/features/ssl#self-signed-cert } }); 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
Đoạn mã này tạo một máy chủ web cơ bản theo dõi 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.
9. 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 lên Cloud Run:
gcloud run deploy helloworld \ --region=us-central1 \ --source=. \ --set-env-vars DB_NAME="quickstart_db" \ --set-env-vars DB_USER="postgres" \ --set-env-vars DB_PASSWORD=${DB_PASSWORD} \ --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \ --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --network=default \ --subnet=default \ --allow-unauthenticated - Nếu được nhắc, hãy nhấn
Yvà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.
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.
10. Xin chúc mừng
Trong phòng thí nghiệm này, bạn đã tìm hiểu cách:
- Tạo một thực thể AlloyDB (được định cấu hình để sử dụng Private Service Connect)
- Triển khai một ứng dụng lên Cloud Run để kết nối với phiên bản AlloyDB
Dọn dẹp
Cloud SQL không có bậc miễn phí và sẽ tính phí nếu bạn tiếp tục sử dụng dịch vụ này. Bạn có thể xoá dự án trên đám mây để tránh phát sinh thêm chi phí.
Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa trong Artifact Registry. Khi bạn xoá dự án trên đám mây, hệ thống sẽ ngừng tính phí cho tất cả tài nguyên được dùng trong dự án đó.
Nếu muốn, hãy xoá dự án:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
Bạn cũng có thể xoá các tài nguyên không cần thiết khỏi đĩa cloudshell. Bạn có thể:
- Xoá thư mục dự án lớp học lập trình:
rm -rf ~/task-app - Cảnh báo! Bạn không thể huỷ thao tác tiếp theo này! Nếu muốn xoá mọi thứ trên Cloud Shell để giải phóng dung lượng, bạn có thể xoá toàn bộ thư mục gốc. Hãy cẩn thận để đảm bảo rằng mọi thứ bạn muốn giữ lại đều được lưu ở nơi khác.
sudo rm -rf $HOME
Tiếp tục học
- Triển khai một ứng dụng Next.js full stack lên Cloud Run bằng Cloud SQL cho PostgreSQL thông qua Trình kết nối Cloud SQL Node.js
- Triển khai một ứng dụng Angular full stack lên Cloud Run bằng Cloud SQL cho PostgreSQL thông qua Trình kết nối Cloud SQL Node.js
- Triển khai một ứng dụng Angular full-stack lên Cloud Run bằng Firestore thông qua SDK dành cho quản trị viên Node.js
- Triển khai một ứng dụng Next.js full-stack lên Cloud Run bằng Firestore thông qua SDK dành cho quản trị viên Node.js