连接到 Cloud SQL:Compute Engine、专用 IP 和 Cloud SQL 代理

1. 简介

上次更新日期:2021 年 5 月 6 日

考虑连接

市面上有许多类型的应用和框架。在此 Codelab 中,我们将介绍如何使用 Cloud SQL 代理,通过内部专用 IP 地址从 Google Compute Engine 中受管理的虚拟机上运行的应用连接到 Cloud SQL。这是在云端运行有状态应用的极其安全的方式。您可以通过限制为仅使用专用 IP 并使用 SQL 代理(可为您处理 SSL 连接)来最大限度地减少暴露于互联网的风险。

例如,一个常见的用例是将本地应用迁移到云端运行。

构建内容

此 Codelab 非常简洁。我们的目标是让您了解连接部分的细节,而无需过多考虑应用本身。在理想情况下,连接到 Cloud SQL 就像连接到任何其他 SQL 数据库实例一样,因此您应该能够将在此 Codelab 中创建的内容应用于任何生产应用。

本指南将详细介绍如何在 GCP 控制台中执行操作,同时还会提供可在 CLI 或自动化环境中使用的等效 gcloud 命令。

具体步骤如下:

  • 创建最低限度的服务账号,以启用与 Cloud SQL 实例的连接
  • 在 Google Compute Engine (GCE) 上创建虚拟机
  • 创建 Cloud SQL 实例(本教程使用 Postgres,但同样适用于 MySQL 或 SQL Server)
  • 在 GCE 实例上下载并运行 Cloud SQL 代理

所需条件

  • 您有权在其中启用 API 和创建服务的 GCP 账号

2. 创建服务账号

服务账号用于授予在 GCP 项目中使用不同服务的权限。在此 Codelab 中,我们需要一个服务账号,以便向 Cloud SQL 代理授予连接到 Cloud SQL 实例的权限。

在控制台中

前往 IAM 服务账号页面,然后点击页面顶部的 f8393a08b37a422c.png 按钮。

为服务账号指定唯一的名称和 ID,然后点击“创建”。

在下一页上,点击“选择角色”的下拉菜单。过滤“Cloud SQL”,然后选择 Cloud SQL Client 角色。点击“继续”。

点击“完成”。

使用 gcloud

创建服务账号:

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

这样会创建服务账号,但目前尚未为其分配任何角色/权限。如需分配适当的角色,请运行以下命令:

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

例如,如果您在创建服务账号时将其命名为 sa-test,并且您的项目为 my-project-test,则命令将如下所示:

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. 创建 Compute Engine 虚拟机

Google Compute Engine 是一项托管式服务,虚拟机将在其中运行,该虚拟机将托管我们想要连接的应用。在此 Codelab 中,我们不会构建应用,但会通过运行 psql 来确认连接。

在控制台中

前往 Google Compute Engine 页面,然后点击 77c46cd1f51bed5c.png 按钮。

这里有很多选项,您只需执行以下操作:

  1. 为实例命名
  2. Machine type 更改为 f1-micro
  3. 在“身份和 API 访问权限”下,将 Service account 的下拉菜单从 Default compute service account 更改为您在之前的步骤中创建的那个。
  4. 点击页面底部的“创建”

使用 gcloud

服务账号是您之前创建的服务账号的全名,因此其格式为:<NAME>@<PROJECT>.iam.gserviceaccount.com

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. 创建 Cloud SQL 实例

Cloud SQL 是我们的托管关系型数据库产品。它支持 MySQL、PostgreSQL 和 SQL Server。在此 Codelab 中,我们将创建一个 Postgres 数据库,但对于所有这三种数据库,相关说明都类似。

在控制台中

前往 Cloud SQL 页面,然后点击 241836b315e11bf5.png 按钮。

如前所述,此 Codelab 的大部分内容适用于任何 SQL 风格,但在此 Codelab 中,请选择 PostgreSQL。

  1. 为实例提供一个 ID
  2. 为默认用户输入密码(用户名将是所选数据库的默认用户名,例如 MySQL 的 root 或 PostgreSQL 的 postgres
  3. 如果您更改了计算实例的区域,还应在此处更改区域以保持一致。
  4. 向下滚动,然后点击 show configuration options
  5. 展开 Connectivity 部分
  6. 取消选中 Public IP 对应的选项,然后选中 Private IP 复选框
  7. 确保在选中“专用 IP”后显示的下拉菜单中选择 default
  8. 向下滚动,然后点击“创建”

实例通常需要几分钟才能启动。

使用 gcloud

由于我们没有提供任何便捷的提示来从此处启用 API,因此我们需要手动执行此操作

gcloud services enable servicenetworking.googleapis.com

接下来,我们需要在默认 VPC 网络上启用专用服务连接。为此,第一步是分配一个命名 IP 地址范围,以供我们的实例使用。

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

接下来,将该 IP 范围分配给我们的内部服务(这大约需要一分钟)。

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

最后,目前只有 Beta 版支持创建实例本身。--no-assign-ip--network=default 的组合可实现专用 IP 连接。目前,无法同时启用专用 IP 和公共 IP,因此如果您需要公共访问权限,则需要在创建实例后进行修改。此命令需要几分钟才能完成。

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. 设置并运行 Cloud SQL 代理

连接到虚拟机后,我们需要一个实例连接字符串。首先,我们将获取该信息,然后通过 SSH 连接到虚拟机本身。这些部分的说明将分别位于“控制台”与“gcloud”部分,其余部分将是可在虚拟机上的 shell 中运行的命令,并位于单独的部分中。

在控制台中

前往此处,然后点击 Cloud SQL 实例的名称。

向下滚动一点,然后将 Connection name 复制到某个位置以供日后使用。

前往 Google Compute Engine 实例列表页面,然后找到包含您的虚拟机的行。

Connect 列中,点击 SSH 按钮,系统会打开一个单独的窗口,安全地连接到虚拟机。

跳过 Using gcloud 部分,因为后续说明适用于这两种情况。

使用 gcloud

<INSTANCE NAME> 替换为您的 Cloud SQL 实例的名称:

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

保存实例连接名称以供日后使用。

您需要将 <ZONE> 替换为创建实例时使用的可用区。如果您未更改该设置,则该设置的值为 us-central1-b。同时,将 <INSTANCE_NAME> 替换为您之前指定的名称。

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

连接到虚拟机后

首先,我们需要下载代理。取决于您的操作系统。如果您在创建虚拟机时未更改操作系统,则该操作系统将为 Linux,您可以使用:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

如果您已切换操作系统,可以点击此处获取适合您操作系统的代理命令。

如需运行代理,请获取您从 Cloud SQL 实例详情中复制的实例连接名称,以替换 <INSTANCE_CONNECTION_NAME>。另请注意,如果您未使用 Postgres 数据库,或者您已更改数据库监听的默认端口,则 TCP 端口号可能会发生变化。

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. 测试连接并总结

如前所述,如果您有想要在 GCE 实例中启动以进行测试的应用,当然也可以。在此 Codelab 中,我们将安装 psql 并使用该客户端验证我们是否可以连接到数据库。

在虚拟机的 SSH 会话中:

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

然后,指定您在创建 Cloud SQL 实例时设置的默认用户密码。

恭喜!如果一切顺利,您应该会看到 Postgres 提示,并且可以针对数据库运行命令。

后续操作

查看下列 Codelab…

参考文档