本页面介绍了从 Cloud Build 中运行的服务连接到 Cloud SQL 实例的相关信息和示例。
Cloud SQL 是一项全代管式数据库服务,可帮助您在云端设置、维护、管理和控制关系型数据库。
Cloud Build 服务可让您在 Google Cloud 基础架构上执行构建。
设置 Cloud SQL 实例
- 在您要从中进行连接的 Google Cloud 项目中启用 Cloud SQL Admin API(如果您尚未执行此操作):
- 创建 Cloud SQL for MySQL 实例。我们建议您在 Cloud Run 服务所在的区域中选择 Cloud SQL 实例位置,以缩短延迟时间,从而避免一些网络费用并降低跨区域故障风险。
默认情况下,Cloud SQL 会为新实例分配公共 IP 地址。 您还可以选择分配专用 IP 地址。如需详细了解这两种地址的连接方案,请参阅连接概览页面。
配置 Cloud Build
配置 Cloud Build 的步骤取决于您分配给 Cloud SQL 实例的 IP 地址类型。公共 IP(默认)
确保您的 Cloud Build 服务账号具有连接到 Cloud SQL 实例所需的 IAM 角色和权限。Cloud Build 服务账号在 Google Cloud 控制台 IAM 页面上作为主账号 [YOUR-PROJECT-NUMBER]@cloudbuild.gserviceaccount.com
列出。
如需在 Google Cloud 控制台中查看此服务账号,请选中包括 Google 提供的角色授权复选框。
您的 Cloud Build 服务账号需要以下某个 IAM 角色:
Cloud SQL Client
(首选)Cloud SQL Admin
cloudsql.instances.connect
cloudsql.instances.get
如果 Cloud Build 服务账号与 Cloud SQL 实例属于不同项目,则需要为这两个项目添加 Cloud SQL Admin API 和 IAM 权限。
专用 IP
如需通过专用 IP 连接到 Cloud SQL 实例,Cloud Build 必须与 Cloud SQL 实例位于同一 VPC 网络中。如需进行配置,请执行以下操作:
- 在 Cloud SQL 实例的 VPC 网络与服务提供方网络之间设置专用连接。
- 创建 Cloud Build 专用池。
配置完成后,当构建在池中运行时,您的应用将能够使用实例的专用 IP 地址和端口 3306
直接连接。
连接到 Cloud SQL
配置 Cloud Build 后,您可以连接到 Cloud SQL 实例。
公共 IP(默认)
对于公共 IP 路径,Cloud Build 同时支持 Unix 和 TCP 套接字。
您可以在 Cloud Build 步骤中使用 Cloud SQL Auth 代理来允许与数据库的连接。此配置会执行以下操作:
- 构建容器并将其推送到 Container Registry。
- 构建第二个容器,并在 Cloud SQL Auth 代理二进制文件中进行复制。
- Cloud Build 构建的容器不需要推送到任何注册表,并且会在构建完成时被舍弃。
- 使用第二个容器启动 Cloud SQL Auth 代理并运行所有迁移命令。
上面的 Cloud Build 代码示例展示了如何在部署上述示例应用以使用 Cloud SQL Auth 代理和 Cloud Build 更新其 Cloud SQL 数据库后运行假设性迁移脚本。如需运行此 Cloud Build 代码示例,您需要执行以下设置步骤:
- 创建一个名为
sql-proxy
的文件夹 - 在
sql-proxy
文件夹中创建Dockerfile
文件,其中包含其文件内容对应的以下单行代码:FROM gcr.io/gcp-runtimes/ubuntu_20_0_4
- 在
sql-proxy
文件夹中创建cloudbuild.yaml
文件。 - 更新
cloudbuild.yaml
文件:- 复制上面的 Cloud Build 代码示例并将其粘贴到
cloudbuild.yaml
文件中。 - 移除未使用的连接方法的代码块,以使用 TCP 连接或 Unix 套接字连接。
- 将
substitutions:
块中的示例代码_DATABASE_TYPE
更新为mysql
。 - 如果您使用的是 TCP 连接,请将
substitutions:
块中的示例代码_DATABASE_PORT
更新为3306
,这是 MySQL 使用的端口。 - 将以下占位值替换为项目中使用的值:
mydatabase
myuser
myinstance
- 复制上面的 Cloud Build 代码示例并将其粘贴到
- 在 Secret Manager 中创建一个名为
database_password
的 Secret。- 为了让 Cloud Build 服务账号访问此 Secret,您必须在 IAM 中向其授予 Secret Manager Secret Accessor 角色。如需了解详情,请参阅使用 Secret Manager 中的 Secret。
- 在
sql-proxy
文件夹中创建 migrate.py 脚本文件。- 该脚本可以使用以下示例引用以下环境变量和
cloudbuild.yaml
文件中创建的 Secret:os.getenv('DATABASE_NAME')
os.getenv('DATABASE_USER')
os.getenv('DATABASE_PASS')
os.getenv('INSTANCE_CONNECTION_NAME')
- 如需引用 Bash 脚本中的相同变量(例如
migrate.sh
),请使用以下示例:$DATABASE_NAME
$DATABASE_USER
$DATABASE_PASS
$INSTANCE_CONNECTION_NAME
- 该脚本可以使用以下示例引用以下环境变量和
- 运行以下
gcloud builds submit
命令,以使用 Cloud SQL Auth 代理构建容器,启动 Cloud SQL Auth 代理,然后运行migrate.py
脚本:gcloud builds submit --config cloudbuild.yaml
专用 IP
对于专用 IP 路径,您的应用会通过专用池直接连接到您的实例。此方法使用 TCP 直接连接到 Cloud SQL 实例,无需使用 Cloud SQL Auth 代理。
使用 TCP 连接
使用作为主机的 Cloud SQL 实例的专用 IP 地址和端口 3306
进行连接。
Python
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Java
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
注意:
- INSTANCE_CONNECTION_NAME 应表示为 <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
- 使用参数 ipTypes=PRIVATE 将强制 SocketFactory 与实例的关联专用 IP 连接
- 如需查看 pom.xml 文件的 JDBC 套接字工厂版本的要求,请点击此处。
Node.js
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Go
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
C#
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Ruby
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
PHP
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
然后,您可以创建 Cloud Build 步骤来直接运行代码。
上面的 Cloud Build 代码示例展示了如何在部署上述示例应用以使用 Cloud Build 更新其 Cloud SQL 数据库后运行假设性迁移脚本。如需运行此 Cloud Build 代码示例,您需要执行以下设置步骤:
- 创建一个名为
sql-private-pool
的文件夹 - 在
sql-private-pool
文件夹中创建Dockerfile
文件,其中包含其文件内容对应的以下单行代码:FROM gcr.io/gcp-runtimes/ubuntu_20_0_4
- 在
sql-private-pool
文件夹中创建cloudbuild.yaml
文件。 - 更新
cloudbuild.yaml
文件:- 复制上面的 Cloud Build 代码示例并将其粘贴到
cloudbuild.yaml
文件中。 - 将以下占位值替换为项目中使用的值:
mydatabase
myuser
databasehost
,采用host:port
的形式。
- 复制上面的 Cloud Build 代码示例并将其粘贴到
- 在 Secret Manager 中创建一个名为
database_password
的 Secret。- 为了让 Cloud Build 服务账号访问此 Secret,您必须在 IAM 中向其授予 Secret Manager Secret Accessor 角色。如需了解详情,请参阅使用 Secret Manager 中的 Secret。
- 在
sql-proxy
文件夹中创建 migrate.py 脚本文件。- 该脚本可以使用以下示例引用以下环境变量和
cloudbuild.yaml
文件中创建的 Secret:os.getenv('DATABASE_NAME')
os.getenv('DATABASE_USER')
os.getenv('DATABASE_PASS')
os.getenv('DATABASE_HOST')
- 如需引用 Bash 脚本中的相同变量(例如
migrate.sh
),请使用以下示例:$DATABASE_NAME
$DATABASE_USER
$DATABASE_PASS
$DATABASE_HOST
- 该脚本可以使用以下示例引用以下环境变量和
- 运行以下
gcloud builds submit
命令,以使用 Cloud SQL Auth 代理构建容器,启动 Cloud SQL Auth 代理,然后运行migrate.py
脚本:gcloud builds submit --config cloudbuild.yaml
最佳做法和其他信息
在本地测试应用时,您可以使用 Cloud SQL Auth 代理。如需了解详细说明,请参阅快速入门:使用 Cloud SQL Auth 代理。
您也可以通过 Docker 容器使用 Cloud SQL 代理进行测试。
数据库架构迁移
通过将 Cloud Build 配置为连接到 Cloud SQL,您可以使用您部署到任何其他无服务器平台的相同代码在 Cloud Build 中运行数据库架构迁移任务。
使用 Secret Manager
您可以使用 Secret Manager 在构建中包含敏感信息。