Triển khai ứng dụng JavaScript lên Cloud Run bằng AlloyDB

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 có trạng thái có thể gọi được 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 một tài khoản dịch vụ sử dụng tính năng Xác thực IAM.

Kiến thức bạn sẽ học được

Trong lớp học lập trình 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 trên Cloud Run để kết nối với phiên bản AlloyDB
  • Sử dụng tính năng Hỗ trợ mã Gemini để thêm chức năng vào ứng dụng

2. Điều kiện tiên quyết

  1. Nếu chưa có Tài khoản Google, bạn phải tạo Tài khoản Google.
    • Sử dụng tài khoản cá nhân thay vì tài khoản công việc hoặc trường học. Tài khoản công việc và tài khoản trường học có thể có các quy định hạn chế khiến bạn không bật được các API cần thiết cho lớp học này.

3. Thiết lập dự án

  1. Đăng nhập vào Google Cloud Console.
  2. Bật tính năng thanh toán trong Cloud Console.
    • Chi phí để hoàn thành lớp học này sẽ dưới 1 USD cho các tài nguyên trên đám mây.
    • Bạn có thể làm theo các bước ở cuối lớp học 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.
  3. 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

  1. Chuyển đến Trình chỉnh sửa Cloud Shell
  2. Nếu cửa sổ dòng lệnh không xuất hiện ở cuối màn hình, hãy mở cửa sổ đó:
    • Nhấp vào trình đơn có biểu tượng ba dấu gạch ngang Biểu tượng trình đơn có ba dấu gạch ngang
    • Nhấp vào Terminal (Thiết bị đầu cuối)
    • Nhấp vào New Terminal (Thiết bị đầu cuối mới)Mở cửa sổ dòng lệnh mới trong Trình chỉnh sửa Cloud Shell
  3. Trong dòng lệnh, 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:
      • Bạn có thể liệt kê tất cả mã dự án bằng:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Đặt mã dự án trong thiết bị đầu cuối của Trình chỉnh sửa Cloud Shell
  4. Nếu bạn được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục. Nhấp để uỷ quyền cho Cloud Shell
  5. Bạn sẽ thấy thông báo này:
    Updated property [core/project].
    
    Nếu bạn thấy WARNING và được hỏi Do you want to continue (Y/N)?, thì có thể bạn đã nhập mã dự án không chính xác. Nhấn N, nhấn Enter rồi thử chạy lại lệnh gcloud 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 bạn được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục. Nhấp để uỷ quyền cho Cloud Shell

Quá trình thực thi lệnh này có thể mất vài phú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ư sau:

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 tài khoản dịch vụ Google Cloud để Cloud Run sử dụng tài khoản đó nhằm có quyền kết nối với AlloyDB.

  1. Chạy lệnh gcloud iam service-accounts create như 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"
    
  2. Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò 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"
    
  3. 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"
    
  4. Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Trình 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 phiên bản AlloyDB

  1. Chạy lệnh gcloud alloydb clusters create để tạo phiên bản Cloud SQL
    gcloud 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
    

Có thể mất vài phút để hoàn tất lệnh này.

  1. Chạy lệnh gcloud alloydb instances create để tạo phiên bản Cloud SQL
    gcloud 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
    
  2. Chạy lệnh gcloud alloydb instances describe để lấy đường liên kết đến tệp đính kèm dịch vụ PSC và xuất đường liên kết đó sang một biến
    export SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \
        --cluster=quickstart-cluster --region=us-central1 \
        --format="value(pscInstanceConfig.serviceAttachmentLink)")
    
  3. gcloud compute addresses create quickstart-address \
      --region=us-central1 \
      --subnet=default
    
  4. gcloud compute forwarding-rules create quickstart-endpoint \
      --region=us-central1 \
      --network=default \
      --address=quickstart-address \
      --target-service-attachment=${SERVICE_ATTACHMENT}
    

Tạo 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ị ứng dụng

Chuẩn bị một ứng dụng Node.js phản hồi các yêu cầu HTTP.

  1. Trong Cloud Shell, hãy tạo một thư mục mới có tên helloworld, sau đó chuyển sang thư mục đó:
    mkdir helloworld
    cd helloworld
    
  2. Khởi tạo tệp package.json dưới dạng mô-đun.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Cài đặt thư viện Google Cloud Auth.
    npm install google-auth-library
    
  4. Cài đặt pg để tương tác với cơ sở dữ liệu PostgreSQL.
    npm install pg
    
  5. Cài đặt express để chấp nhận các yêu cầu http đến.
    npm install express
    
  6. Tạo tệp index.mjs có mã ứ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
    Chạy lệnh sau trong Cloud Shell:
    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
    

Mã này tạo một máy chủ web cơ bản để nghe trên cổng do biến môi trường PORT xác định. Ứng dụng hiện đã sẵn sàng để triển khai.

9. Triển khai ứng dụng Cloud Run

  1. Chạy lệnh gcloud projects add-iam-policy-binding như sau để thêm vai trò Người dùng mạng vào tài khoản dịch vụ Cloud Run cho dịch vụ Cloud Run mà bạn sắp tạo.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:service-$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"
    
  1. Chạy lệnh dưới đây để 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
    
  2. Nếu được nhắc, hãy nhấn YEnter để 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 lớp học lập trình 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 trên Cloud Run để kết nối với phiên bản AlloyDB
  • Sử dụng tính năng Hỗ trợ mã Gemini để thêm chức năng vào ứng dụng

Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử 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 và 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}