mysql - 使用映射自定义子域时,Google Cloud Run 失去了与 Mysql 的连接
问题描述
映射自定义域时,从云运行连接到我的 SQL 实例时遇到问题。在自定义域映射之前,连接很好,之后它只是抛出错误:连接 ETIMEDOUT。
我正在使用公共 IP,在我看来,我应该将映射子域的 IP 添加为允许的网络,问题是映射只是指向 ghs.googlehosted.com 的 CNAME。分配的 IP 是动态的 DN。我无法从 Google 获得他们的 IP 范围,所以我也无法添加范围。
根据文档,Cloud Run 在使用套接字时使用 Cloud SQL 代理,因此理论上它应该处理动态 IP。
有什么帮助吗?
解决方案
您可以通过不同方式连接 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,尽情享受吧!
推荐阅读
- android - 在 Android 中处理搜索视图(我知道如何搜索单个单词,但这里的情况不同)?
- javascript - “表单提交取消,因为表单未连接”
- java - Hazelcast Jet 丢弃空聚合结果
- java - 奇怪的 if 语句给我带来了问题
- ios - 如何从 UITableView 数据(UIImage 和 String)中提取到另一个 ViewController
- jasmine - 抑制独立 Jasmine 3.1 浏览器报告中的“加载时出错”消息
- python - python瓶,外部js和css找不到
- node.js - 关于 Node.js,Bootstrap npm 包最近被弃用了吗?
- api - GraphCool TypeError:将循环结构转换为 JSON
- vue.js - 如何动态控制 v-for 时间?