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

1. 简介

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

考虑彼此之间的联系

应用和框架有很多种。在此 Codelab 中,我们将介绍如何使用 Cloud SQL 代理从在 Google Compute Engine 中的代管式虚拟机上运行的应用连接到 Cloud SQL。这是一种在云端运行有状态应用的极其安全的方法。您通过限制仅使用专用 IP,并使用为您处理 SSL 连接的 SQL 代理,最大限度地降低了您在互联网上的暴露风险。

一个常见的使用场景是,本地应用已转为在云端(而非本地)运行。

构建内容

此 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 按钮。

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

  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 按钮。

如前所述,此 Codelab 的大部分内容适用于所有 SQL 变种,但对于此 Codelab,请选择 PostgreSQL。

  1. 为实例指定 ID
  2. 输入默认用户的密码(用户名将是所选数据库的默认用户名,例如 root(对于 MySQL)或 postgres(对于 PostgreSQL)
  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…

参考文档