问题描述
在映射自定义域时从云运行连接到我的 sql 实例时遇到问题。在自定义域映射之前,连接很好,之后它只是抛出错误:连接ETIMEDOUT。
我正在使用公共 IP,在我看来,我应该将映射子域的 IP 添加为允许的网络,问题是映射只是一个指向 ghs.googlehosted.com 的 CNAME。分配的 IP 是动态的 DN。我无法从 Google 获取他们的 IP 范围,因此我也无法添加范围。
根据文档,Cloud Run 在使用套接字时使用 Cloud sql 代理,因此理论上它应该处理动态 IP。
有什么帮助吗?
解决方法
您可以通过不同方式连接您的 Cloud SQL 数据库。首先,在 the documentation 中,您可以看到其中的 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,但这次将出口参数设置为 ALL(而不是内部 ip 范围,因为您可以为私有 IP 访问做)。
现在您拥有了:Cloud Run 启动传出连接时的公共静态 IP。在 Cloud SQL 上授权此 IP,然后享受!