1. 概览
Cloud Run 是一个全托管式无服务器平台,供您运行可通过 HTTP 请求调用的无状态容器。此 Codelab 将演示如何使用 IAM 身份验证通过服务账号将 Cloud Run 上的 Node.js 应用安全地连接到 AlloyDB。
学习内容
在本实验中,您将学习如何完成以下操作:
- 创建 AlloyDB 实例(配置为使用 Private Service Connect)
- 将应用部署到 Cloud Run,使其连接到您的 AlloyDB 实例
2. 前提条件
- 如果您还没有 Google 账号,则必须先创建一个 Google 账号。
- 请改用个人账号,而非工作账号或学校账号。工作账号和学校账号可能存在限制,导致您无法启用本实验所需的 API。
3. 项目设置
- 登录 Google Cloud 控制台。
- 在 Cloud 控制台中启用结算功能。
- 完成本实验的 Cloud 资源费用应低于 1 美元。
- 您可以按照本实验末尾的步骤删除资源,以避免产生更多费用。
- 新用户符合参与 $300 USD 免费试用计划的条件。
- 创建新项目或选择重复使用现有项目。
4. 打开 Cloud Shell Editor
- 前往 Cloud Shell 编辑器
- 如果终端未显示在屏幕底部,请打开它:
- 点击汉堡式菜单

- 点击终端
- 点击 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=defaultgcloud 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 请求的时间存储在数据库中
- 返回最后 5 个请求的时间
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
这段代码会创建一个基本 Web 服务器,监听由 PORT 环境变量定义的端口。应用现已准备就绪,可以进行部署。
9. 部署 Cloud Run 应用
- 运行以下命令,将应用部署到 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 格式返回的最近 5 次访问记录。
几分钟后,应用应会提供一个供您访问的网址。
前往相应网址,查看您的应用的实际效果。每次访问该网址或刷新页面时,您都会看到以 JSON 格式返回的最近 5 次访问记录。
10. 恭喜
在本实验中,您学习了如何执行以下操作:
- 创建 AlloyDB 实例(配置为使用 Private Service Connect)
- 将应用部署到 Cloud Run,使其连接到您的 AlloyDB 实例
清理
Cloud SQL 没有免费层级,如果您继续使用,则需要付费。您可以删除 Cloud 项目,以避免产生额外费用。
虽然 Cloud Run 不会对未在使用中的服务计费,但您可能仍然需要支付将容器映像存储在 Artifact Registry 中而产生的相关费用。删除 Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。
如果您愿意,可以删除项目:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
您可能还希望从 Cloud Shell 磁盘中删除不必要的资源。您可以:
- 删除 Codelab 项目目录:
rm -rf ~/task-app - 警告!接下来执行的操作无法撤消!如果您想删除 Cloud Shell 中的所有内容以释放空间,可以删除整个主目录。请务必将要保留的所有内容保存到其他位置。
sudo rm -rf $HOME