1. 總覽
Cloud Run 是全代管無伺服器平台,能夠讓您執行可透過 HTTP 要求叫用的無狀態容器。本程式碼研究室將示範如何透過使用 IAM 驗證的服務帳戶,將 Cloud Run 上的 Node.js 應用程式安全地連線至 AlloyDB。
學習目標
本實驗室的學習內容包括:
- 建立 AlloyDB 執行個體 (已設定為使用 Private Service Connect)
- 將可連線至 AlloyDB 執行個體的應用程式部署至 Cloud Run
- 使用 Gemini Code Assist 為應用程式新增功能
2. 先決條件
- 如果您還沒有 Google 帳戶,請務必建立 Google 帳戶。
- 請改用個人帳戶,而非公司或學校帳戶。工作和學校帳戶可能有限制,導致您無法啟用本實驗室所需的 API。
3. 專案設定
- 登入 Google Cloud 控制台。
- 在 Cloud 控制台中啟用帳單。
- 完成本研究室的費用應低於 $1 美元。
- 您可以按照本實驗室課程結尾的步驟刪除資源,避免產生其他費用。
- 新使用者可享有價值 $300 美元的免費試用期。
- 建立新專案或選擇重複使用現有專案。
4. 開啟 Cloud Shell 編輯器
- 前往 Cloud Shell 編輯器
- 如果終端機未顯示在畫面底部,請按照下列步驟開啟:
- 按一下漢堡選單
- 按一下「Terminal」
- 按一下「New Terminal」
- 按一下漢堡選單
- 在終端機中,使用以下指令設定專案:
- 格式:
gcloud config set project [PROJECT_ID]
- 範例:
gcloud config set project lab-project-id-example
- 如果您忘記專案 ID,請按照下列步驟操作:
- 您可以使用下列指令列出所有專案 ID:
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- 您可以使用下列指令列出所有專案 ID:
- 格式:
- 如果出現授權提示訊息,請點選「授權」繼續操作。
- 您應該會看到下列訊息:
如果您看到Updated property [core/project].
WARNING
並收到Do you want to continue (Y/N)?
要求,表示您可能輸入的專案 ID 有誤。按下N
和Enter
鍵,然後再次嘗試執行gcloud config set project
指令。
5. 啟用 API
在終端機中啟用 API:
gcloud services enable \
compute.googleapis.com \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.googleapis.com
如果出現授權提示訊息,請點選「授權」繼續操作。
這個指令可能需要幾分鐘才能完成,但最終應該會顯示類似以下的成功訊息:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. 設定服務帳戶
建立並設定 Cloud Run 可使用的 Google Cloud 服務帳戶,讓該帳戶具備連線至 AlloyDB 的正確權限。
- 請執行以下
gcloud iam service-accounts create
指令,建立新的服務帳戶:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account"
- 執行 gcloud projects add-iam-policy-binding 指令,如以下所示,將 AlloyDB 資料庫使用者角色新增至您剛才建立的 Google Cloud 服務帳戶。
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/alloydb.databaseUser"
- 執行以下 gcloud projects add-iam-policy-binding 指令,將「Service Usage Consumer」角色新增至您剛才建立的 Google Cloud 服務帳戶。
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/serviceusage.serviceUsageConsumer"
- 執行以下 gcloud projects add-iam-policy-binding 指令,將「Log Writer」角色新增至您剛建立的 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"
7. 建立 AlloyDB 例項
- 執行
gcloud alloydb clusters create
指令,建立 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
這個指令可能需要幾分鐘才能完成。
- 執行
gcloud alloydb instances create
指令建立 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
- 執行
gcloud alloydb instances describe
指令,取得 PSC 服務附件連結並匯出至變數export 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=default
gcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
為先前建立的服務帳戶建立 PostgreSQL 資料庫使用者,以便存取資料庫。
gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
8. 準備申請
準備可回應 HTTP 要求的 Node.js 應用程式。
- 在 Cloud Shell 中建立名為
helloworld
的新目錄,然後切換至該目錄:mkdir helloworld cd helloworld
- 將
package.json
檔案初始化為模組。npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs"
- 安裝 Google Cloud Auth 程式庫。
npm install google-auth-library
- 安裝
pg
與 PostgreSQL 資料庫互動。npm install pg
- 安裝 Express,以便接收傳入的 HTTP 要求。
npm install express
- 使用應用程式程式碼建立
index.mjs
檔案。這段程式碼可執行以下操作:- 接受 HTTP 要求
- 連線至資料庫
- 將 HTTP 要求的時間儲存在資料庫中
- 傳回最近五次要求的時間
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
這段程式碼會建立基本的網路伺服器,用於監聽 PORT 環境變數定義的通訊埠。應用程式現在已準備好部署。
9. 部署 Cloud Run 應用程式
- 執行 gcloud projects add-iam-policy-binding 指令,如以下所示,將「Network User」角色新增至 Cloud Run 服務帳戶,以便為您要建立的 Cloud Run 服務建立政策。
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"
- 執行下列指令,將應用程式部署至 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
- 如有提示,請按下
Y
和Enter
鍵,確認要繼續操作:Do you want to continue (Y/n)? Y
幾分鐘後,應用程式應會提供網址供您造訪。
前往該網址,查看應用程式的運作情形。每次造訪網址或重新整理頁面時,系統都會以 JSON 格式傳回最近五次的造訪記錄。
幾分鐘後,應用程式應會提供網址供您造訪。
前往該網址,查看應用程式的運作情形。每次造訪網址或重新整理頁面時,系統都會以 JSON 格式傳回最近五次的造訪記錄。
10. 恭喜
在本實驗室中,您學到如何:
- 建立 AlloyDB 執行個體 (已設定為使用 Private Service Connect)
- 將可連線至 AlloyDB 執行個體的應用程式部署至 Cloud Run
- 使用 Gemini Code Assist 為應用程式新增功能
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。如要刪除整個專案,請執行以下指令:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}