本页介绍从 Cloud Run 中运行的服务连接到 Cloud SQL 实例的相关信息和示例。
如需了解运行连接到 Cloud SQL 的 Cloud Run 示例 Web 应用的分步说明,请参阅从 Cloud Run 连接快速入门。
Cloud SQL 是一项全托管式数据库服务,可帮助您在云端设置、维护、管理和控制关系型数据库。
Cloud Run 是一个托管式计算平台,可让您直接在 Google Cloud 基础设施之上运行容器。
设置 Cloud SQL 实例
- 在您要从中进行连接的 Google Cloud 项目中启用 Cloud SQL Admin API(如果您尚未执行此操作):
- 创建 Cloud SQL for SQL Server 实例。我们建议您在 Cloud Run 服务所在的区域中选择 Cloud SQL 实例位置,以缩短延迟时间,从而避免一些网络费用并降低跨区域故障风险。
默认情况下,Cloud SQL 会为新实例分配公共 IP 地址。 您还可以选择分配专用 IP 地址。如需详细了解这两种地址的连接方案,请参阅连接概览页面。
配置 Cloud Run
配置 Cloud Run 的步骤取决于您分配给 Cloud SQL 实例的 IP 地址类型。如果您通过直接 VPC 出站流量或无服务器 VPC 访问通道连接器路由所有出站流量,请使用专用 IP 地址。比较两种网络出站流量方法。公共 IP(默认)
Cloud Run 支持使用 Go、Java 和 Python 连接器通过公共 IP 地址连接到 Cloud SQL for SQL Server。
- 确保实例具有公共 IP 地址。您可以在 Google Cloud 控制台中的实例概览页面上验证这一点。如果您需要添加 IP 地址,请参阅配置公共 IP 页面来查看相关说明。
- 获取实例的 INSTANCE_CONNECTION_NAME。您可以在 Google Cloud 控制台中的实例概览页面上或者通过运行以下
gcloud sql instances describe
命令找到此值: 将 INSTANCE_NAME 替换为您的 Cloud SQL 实例的名称。gcloud sql instances describe INSTANCE_NAME
- 获取 Cloud Run 服务的 CLOUD_RUN_SERVICE_ACCOUNT_NAME。您可以在 Google Cloud 控制台中托管 Cloud Run 服务的项目的 IAM 页面上找到此值,也可以在托管 Cloud Run 服务的项目中运行以下
gcloud run services describe
命令来找到此值: 替换以下变量:gcloud run services describe CLOUD_RUN_SERVICE_NAME --region CLOUD_RUN_SERVICE_REGION --format="value(spec.template.spec.serviceAccountName)"
- CLOUD_RUN_SERVICE_NAME:Cloud Run 服务的名称
- CLOUD_RUN_SERVICE_REGION:Cloud Run 服务所在的区域
- 为 Cloud Run 服务 配置服务账号。请确保该服务账号具有适当的 Cloud SQL 角色和权限以连接到 Cloud SQL。
Cloud SQL Client
(首选)Cloud SQL Admin
cloudsql.instances.connect
cloudsql.instances.get
- 如果您要向新服务添加 Cloud SQL 连接,则需要将服务容器化并上传到 Container Registry 或 Artifact Registry。如果您还没有连接,请参阅有关构建和部署容器映像的以下说明。
-
您的服务的服务账号需要以下某个 IAM 角色:
与任何配置更改一样,为 Cloud SQL 连接设置新配置会导致创建新的 Cloud Run 修订版本。除非您进行了明确更新,否则后续修订版本也将自动采用此 Cloud SQL 连接。
控制台
-
开始配置服务。如需向现有服务添加 Cloud SQL 连接,请执行以下操作:
- 在服务列表中,点击所需服务的名称。
- 在 View in Cloud Functions(在 Cloud Functions 中查看)下,点击服务名称。
- 点击修改并重新部署。
- 允许连接到 Cloud SQL 实例:
- 点击容器、变量和密钥、连接、安全性
- 点击容器标签页。
- 滚动到 Cloud SQL 连接。
- 点击添加连接。
- 如果您尚未启用 Cloud SQL Admin API,请点击 Enable the Cloud SQL Admin 按钮。
- 如果您是在向自己项目中的 Cloud SQL 实例添加连接,请从菜单中选择所需的 Cloud SQL 实例。
- 如果您使用的是来自其他项目的 Cloud SQL 实例,请在菜单中选择自定义连接字符串,然后以 PROJECT-ID:REGION:INSTANCE-ID 格式输入完整实例连接名称。
- 如需删除关联,请将光标悬停在关联右侧以显示 Delete 图标,然后点击该图标。
-
点击创建或部署。
命令行
在使用下面的任何命令之前,请先进行以下替换:
- 将 IMAGE 替换为您要部署的映像
- 将 SERVICE_NAME 替换为您的 Cloud Run 服务的名称
-
将 INSTANCE_CONNECTION_NAME 替换为 Cloud SQL 实例的实例连接名称,或以英文逗号分隔的连接名称列表。
如果要部署新容器,请使用以下命令:
如果您要更新现有服务,请使用以下命令:gcloud run deploy \ --image=IMAGE \ --add-cloudsql-instances=INSTANCE_CONNECTION_NAME
gcloud run services update SERVICE_NAME \ --add-cloudsql-instances=INSTANCE_CONNECTION_NAME
Terraform
以下代码会创建一个基础 Cloud Run 容器,其中包含连接的 Cloud SQL 实例。
-
输入
terraform apply
以应用更改。 - 通过检查 Cloud Run 服务,点击修订版本标签页,然后点击连接标签页来验证更改。
专用 IP
如果授权服务账号所属的项目与包含 Cloud SQL 实例的项目不同,请执行以下操作:
- 在这两个项目中启用 Cloud SQL Admin API。
- 对于包含 Cloud SQL 实例的项目中的服务账号,添加 IAM 权限。
连接到 Cloud SQL
配置 Cloud Run 后,您可以连接到 Cloud SQL 实例。
公共 IP(默认)
对于公共 IP 路径,Cloud Run 提供加密功能,并使用 Cloud SQL 连接器进行连接。
使用 Cloud SQL 连接器连接
Cloud SQL 连接器是在连接到 Cloud SQL 实例时提供加密和基于 IAM 的授权的语言专用库。
Python
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Java
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
注意:
- CLOUD_SQL_CONNECTION_NAME 应表示为 <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
- 如需查看 pom.xml 文件的 JDBC 套接字工厂版本的要求,请点击此处。
Go
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
使用 Secret Manager
Google 建议您使用 Secret Manager 存储 SQL 凭据等敏感信息。您可以使用 Cloud Run 将 Secret 作为环境变量传递或装载为卷。
在 Secret Manager 中创建 Secret 后,使用以下命令更新现有服务:
命令行
gcloud run services update SERVICE_NAME \ --add-cloudsql-instances=INSTANCE_CONNECTION_NAME --update-env-vars=INSTANCE_CONNECTION_NAME=INSTANCE_CONNECTION_NAME_SECRET \ --update-secrets=DB_USER=DB_USER_SECRET:latest \ --update-secrets=DB_PASS=DB_PASS_SECRET:latest \ --update-secrets=DB_NAME=DB_NAME_SECRET:latest
Terraform
以下命令会创建 Secret 资源,以使用 google_secret_manager_secret
和 google_secret_manager_secret_version
安全地保存数据库用户、密码和名称值。请注意,您必须更新项目计算服务账号才能访问每个 Secret。
更新 Cloud Run 主资源以包含新 Secret。
输入 terraform apply
以应用更改。
示例命令使用 Secret 版本 latest;但是,Google 建议将 Secret 固定为特定版本 SECRET_NAME:v1。
专用 IP
对于专用 IP 路径,您的应用会通过 VPC 网络直接连接到您的实例。此方法使用 TCP 直接连接到 Cloud SQL 实例,无需使用 Cloud SQL Auth 代理。
使用 TCP 连接
使用作为主机的 Cloud SQL 实例的专用 IP 地址和端口 1433
进行连接。
Python
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Java
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
注意:
- CLOUD_SQL_CONNECTION_NAME 应表示为 <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
- 使用参数 ipTypes=PRIVATE 将强制 SocketFactory 与实例的关联专用 IP 连接
- 如需查看 pom.xml 文件的 JDBC 套接字工厂版本的要求,请点击此处。
Node.js
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Go
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
Ruby
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
PHP
如需了解 Web 应用环境下的此代码段,请查看 GitHub 上的 README。
最佳做法和其他信息
在本地测试应用时,您可以使用 Cloud SQL Auth 代理。如需了解详细说明,请参阅快速入门:使用 Cloud SQL Auth 代理。
您也可以通过 Docker 容器使用 Cloud SQL 代理进行测试。
连接池
与底层数据库的连接可能会被数据库服务器本身或平台基础架构断开。我们建议您使用支持连接池的客户端库,因为连接池可自动重新连接断开的客户端连接。如需查看有关如何使用连接池的详细示例,请参阅管理数据库连接页面。连接限制
MySQL 和 PostgreSQL 版本的 Cloud SQL 都对并发连接数设定了上限,这些限制可能因所选的数据库引擎而异(请参阅 Cloud SQL 配额和限制页面)。Cloud Run 容器实例与 Cloud SQL 数据库之间最多只能建立 100 个连接。每个 Cloud Run 服务或作业实例可以与数据库建立 100 个连接,并且在此服务或作业扩容时,每个部署的连接总数可以随之增加。
您可以使用连接池来限制每个实例使用的最大连接数。如需查看有关如何限制连接数的详细示例,请参阅管理数据库连接页面。