使用 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.1localhost 上连接不起作用。连接被拒绝。

什么是使用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

PostSQL | Debug记录

在 Google-App-Engine 中使用 HSQLDB

将 GCP App Engine 限制为仅使用 1 个单元的 app engine flex core

[转]TCP/IP Offload Engine

如何管理 App Engine Go 运行时上下文以避免 App Engine 锁定?