使用 TCP 的 App Engine PostgreSQL 连接错误
Posted
技术标签:
【中文标题】使用 TCP 的 App Engine PostgreSQL 连接错误【英文标题】:App Engine PostgreSQL connection error using TCP 【发布时间】:2019-07-18 11:22:57 【问题描述】:我在 Google App Engine 灵活的环境中部署了一个 Python 3 应用程序。
我正在使用 psycopg2 连接到托管在 Google 云 SQL 中的 PostgreSQL 实例。
我无法从 Google App Engine 连接到 PostgreSQL。
Cloud SQL Proxy 似乎初始化正常,但它绑定到 0.0.0.0
Listening on 0.0.0.0:5432 for projectID:us-central1:my-db
尝试在127.0.0.1
或localhost
上连接不起作用。连接被拒绝。
什么是使用docker(应用引擎柔性环境在下面使用docker)默认IP172.17.0.1
(来自docker0适配器)
如果有人决定更改它,使用该 IP 地址连接到 Cloud SQL 似乎会让我大吃一惊。
为什么会这样?
使用默认 docker0 适配器的 IP 地址是可行的长期解决方案吗?
除了切换到基于socket
的连接而不是tcp
方法之外,还有其他选择吗?
【问题讨论】:
检查这个*** question解释了关于127.17.0.1的默认IP 【参考方案1】:听起来您正在主机上运行 Cloud SQL 代理,而您正试图从容器内运行应用程序。无法连接到proxy的原因是因为127.0.0.1
指的是docker的loopback接口,而proxy绑定的是宿主机的接口。 172.17.0.1
是容器可以用来访问主机接口的地址。
另一种方法是 use host networking (https://docs.docker.com/network/host/
),通过传入 --network host
。这将导致主机接口用于应用程序。
【讨论】:
不幸的是,这是在 Google App Engine 上,我认为我无法通过 Dockerfile 更改网络。 这就是您在本地运行时如何实现此目的 - 在 App Engine Flex 中运行时,环境会为您提供127.0.0.1
上的端口。请参阅Connecting from App Engine page。
我在 App Engine Flex 环境中看到了这种行为。我遵循了相同的文档,但这似乎是 App Engine 中的一个错误
在您的原始评论中,您提到您正在使用代理。您是否尝试在 App Engine 环境中运行代理?
这就是谷歌应用引擎连接云sql的方式。通过云 sql 代理,至少在柔性环境中。【参考方案2】:
我已经从使用 TCP 作为连接方法切换到使用 Unix 套接字。
TCP 问题似乎是应用引擎柔性环境中的错误。但它是一个测试版功能(它在 app.yaml 中名为 beta_settings),我不希望 Google 修复它。
我也不想承诺将来某个时候可能会更改的 IP 地址作为解决方法。
【讨论】:
以上是关于使用 TCP 的 App Engine PostgreSQL 连接错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 sqlalchemy 连接到本地 postgresql
在 Google-App-Engine 中使用 HSQLDB