首页 > 解决方案 > 使用映射自定义子域时,Google Cloud Run 失去了与 Mysql 的连接

问题描述

映射自定义域时,从云运行连接到我的 SQL 实例时遇到问题。在自定义域映射之前,连接很好,之后它只是抛出错误:连接 ETIMEDOUT。

我正在使用公共 IP,在我看来,我应该将映射子域的 IP 添加为允许的网络,问题是映射只是指向 ghs.googlehosted.com 的 CNAME。分配的 IP 是动态的 DN。我无法从 Google 获得他们的 IP 范围,所以我也无法添加范围。

根据文档,Cloud Run 在使用套接字时使用 Cloud SQL 代理,因此理论上它应该处理动态 IP。

有什么帮助吗?

标签: mysqlgoogle-cloud-runcloud-sql-proxy

解决方案


您可以通过不同方式连接 Cloud SQL 数据库。首先,在文档中您可以看到其中 2 个:

  • 使用 Cloud SQL 数据库的公共 IP 创建一个 Unix 套接字来连接您的数据库。我可以理解,对于某些库/框架,Unix 套接字有时不是标准的,您更喜欢 IP
  • 使用公共 IP:如果您想使用 IP,这是我的首选解决方案。您必须创建一个无服务器 VPC 连接器来将内部流量路由到 VPC,然后安全地到达您的数据库。但是,如果 Cloud SQL 实例不在您的项目中,您需要执行对等互连但它不起作用(说来话长,但相信我,VPC 对等互连 + Cloud SQL 私有 IP 不起作用)。

所以,最后的解决方案是在 Cloud SQL 实例上授权网络,当然不是 0.0.0.0/0!

为此,您需要在启动传出连接时从 Cloud Run 获取公共 IP。您可以使用Cloud NAT实现此目的。

在您的 Cloud NAT 配置中,选择您保留的私有 IP,以确保始终重复使用相同的 IP。在此配置中,您还将使用 Cloud NAT,但这次将 egress 参数设置为 ALL(而不是像私有 IP 访问那样设置为内部 IP 范围)。

现在您拥有了:当 Cloud Run 发起传出连接时的公共静态 IP。在 Cloud SQL 上授权此 IP,尽情享受吧!


推荐阅读