我正在开发一个在 Cloud Run 上运行的 python Web 服务器。服务器需要能够向外部 API 发送一些 GET 和 POST 请求,但这是失败的。在此特定示例中,我尝试查询 Google 地图 api。但我在其他端点上也遇到了同样的错误。
这是错误消息:
requests.exceptions.SSLError: HTTPSConnectionPool(host='plus.codes', port=443): Max retries exceeded with url: /api?address=78G9%2B2Q%2C%20Orem%2C%20UT%2C%20USA&key=xxxxxxxx (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1007)')))
我能够在本地启动 Docker 容器并使其正常工作(请求顺利通过),这告诉我问题来自我的 Cloud Run 网络配置。
我尝试使用入口/出口更新防火墙规则以允许所有传出流量,但这没有帮助。但我不得不承认我对网络的了解只有一点点。
文档还指出不应使用 TLS 流量。但我不确定这意味着什么,但也许这与问题有关:https://cloud.google.com/run/docs/container-contract#tls
我已经研究这个问题几天了,我必须说,我有点困惑,从 Cloud Run 实例执行简单的 python 请求是如此困难。关于这个看似基本的任务,并没有很多文档、教程和 stackoverflow 线程。就好像我是唯一一个尝试从 Cloud Run 实例连接到互联网的人。
感谢您的帮助
您应该查看静态出站IP地址。
默认情况下,Cloud Run 服务使用动态 IP 地址池连接到 Internet 上的外部端点,例如使用基于 IP 地址的防火墙的数据库或 API。但是,这些需要来自静态 IP 地址的连接。您在这里可以做的是将 Cloud Run 配置为使用静态 IP 地址路由请求。
您需要配置 Cloud Run 服务的 VPC 出口,以通过具有配置有静态 IP 地址的 Cloud NAT 网关的 VPC 网络路由所有出站流量。
您可以按照上述文档启用 Cloud Run 服务使用静态 IP 地址发送请求。