1

我使用 Google 提供的Terraform 模块在Cloud Foundation Toolkit之后在 GCP 中创建了我的组织基础架构。

下表列出了所有环境的 IP 范围:

VPC IP 范围

现在我正在部署我的应用程序,该应用程序基本上由 Cloud Run 服务和 Cloud SQL (Postgres) 实例组成。Cloud SQL 实例是使用为对等服务(例如 Cloud SQL)保留的“未分配”IP 范围中的私有 IP 创建的。

为了在 Cloud Run 和 Cloud SQL 之间建立连接,我还创建了 Serverless VPC 连接器(ip 范围 10.1.0.16/28)并配置了 Cloud SQL 代理。

云运行服务

当我尝试从 Cloud Run 服务连接到数据库时,大约 10 秒后出现此错误:

CloudSQL 连接失败。有关更多详细信息,请参阅https://cloud.google.com/sql/docs/mysql/connect-run:发布“https://www.googleapis.com/sql/v1beta4/projects/[my-project]/instances /platform-db/createEphemeral?alt=json&prettyPrint=false": 超出上下文期限

我已授予roles/vpcaccess.user默认 Cloud Run SA 和宿主项目中应用程序使用的 SA。

我已授予roles/compute.networkUser服务项目中的两个 SA。我还授予roles/cloudsql.client了这两个 SA。

我已经启用servicenetworking.googleapis.comvpcaccess.googleapis.com在服务项目中。

我的想法已经用完了,我无法弄清楚问题是什么。

当 Cloud Run 尝试创建对 Cloud SQL API 的 POST 请求时,这似乎是一个超时错误。因此,VPC 连接器 (10.1.0.16/28) 似乎无法连接到 Cloud SQL 实例 (10.0.80.0/20)。

有没有人遇到过这个问题?

4

2 回答 2

2

当您在 Cloud Run(以及 App Engine 和 Cloud Function)中使用 Cloud SQL 内置连接时,会创建一个类似于 Cloud SQL 代理的连接。这种连接只能在 Cloud SQL 公共 IP 上实现,即使您有无服务器 VPC 连接器并且您的数据库可通过 VPC 访问。

如果您在 Cloud SQL 上只有私有 IP,则需要使用私有 IP 访问数据库,而不是内置的 Cloud SQL 连接器。文档中的更多详细信息

我也为此写了一篇文章

于 2021-01-22T08:12:40.240 回答
0

如果您使用的是私有 IP,则需要检查 docker bridge 网络的 IP 范围。这是文档中的内容:

如果客户端无法使用私有 IP 连接到 Cloud SQL 实例,请检查客户端是否使用 172.17.0.0/16 范围内的任何 IP。从 172.17.0.0/16 范围内的任何 IP 到使用私有 IP 的 Cloud SQL 实例的连接失败。同样,使用该范围内的 IP 创建的 Cloud SQL 实例也无法访问。这个范围是为 docker bridge 网络保留的。

要解决您遇到的一些问题,请按照此处的文档并发布您收到的任何错误消息,例如,您可以尝试:

尝试使用gcloud sql connect命令连接到您的实例。此命令会在短时间内授权您的 IP 地址。您可以在安装了 Cloud SDK 和 mysql 客户端的环境中运行此命令。您也可以在 Cloud Shell 中运行此命令,该命令可在 Google Cloud Console 中使用,并且预装了 Cloud SDK 和 mysql 客户端。

暂时允许所有 IP 地址连接到实例。对于 IPv4 授权 0.0.0.0/0(对于 IPv6,授权 ::/0。测试后,请确保再次删除它,因为它向世界开放!

你在使用连接池吗?

如果没有,我会创建一个连接缓存,以便当您的应用程序需要链接到数据库时,它可以从池中获取临时连接。应用程序完成操作后,连接将再次返回池以供以后使用。为了使其正常工作,连接需要有效地打开和关闭,并且不浪费任何资源。

于 2021-01-22T15:53:58.513 回答