Google App Engine 上的 Django 应用程序未连接到 Google Cloud SQL

问题描述 投票:0回答:1

我在 Google App Engine 上部署 Django 应用程序并尝试将其连接到 Google Cloud SQL 时遇到了问题。该应用程序在我的本地系统上完美运行,但是在部署时,我收到以下连接错误:

无法连接到服务器:连接被拒绝 服务器是否在主机“127.0.0.1”上运行并接受 端口 5432 上的 TCP/IP 连接?

这是我的settings.py 文件的代码片段:

DATABASES = {"default": env.db()}


# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# [END gaestd_py_django_database_config]
# [END db_setup]

# Use a in-memory sqlite3 database when testing in CI systems
# TODO(glasnt) CHECK IF THIS IS REQUIRED because we're setting a val above
if os.getenv("TRAMPOLINE_CI", None):
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.sqlite3",
            "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
        }
    }

我已按照 this 指南在 Google 应用引擎上设置我的应用程序。

这些是我迄今为止尝试过的所有故障排除步骤 -

  • 启用了 Cloud SQL 管理 API。

  • 向 App Engine 服务帐户添加了 Cloud SQL 管理员角色。

  • 测试了从 App Engine 到 SQL 实例的连接。

  • 尝试重新启动 Cloud SQL 实例和 App Engine 实例。

  • 检查云控制台上的日志,刚刚得到这个 -

psycopg2.OperationalError: could not connect to server: Connection refused

at .connect ( /layers/google.python.pip/pip/lib/python3.9/site-packages/psycopg2/init.py:122 )at .get_new_connection ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/postgresql/base.py:215 )at .inner ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/asyncio.py:26 )at .connect ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/base/base.py:263 )at .inner ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/asyncio.py:26 )at .ensure_connection ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/base/base.py:282 )

我还检查了云 SQL 的“网络”选项卡,它显示“App Engine 授权:默认情况下此项目中的所有应用程序均已授权。”

django google-cloud-platform google-app-engine google-cloud-sql
1个回答
0
投票

看起来您可能在底层代码中发现了一个错误。

Cloud SQL 代理可以通过两种方式部署,即通过端口

127.0.0.1
在本地主机
5432
上使用 TCP 连接(如快速入门所示)(对于 Postgres,对于 MySQL 为 3306 等)。

这是代码的预期内容,也是您的部署在本地运行的原因:

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

Cloud SQL 代理还可以使用 Unix 套接字而不是 TCP 连接来部署。 App Engine 使用 Unix 套接字自动部署 Cloud SQL 代理,而NOT则通过 TCP。它期望你的主机是 Unix 套接字的路径

/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME

此代码示例/快速入门的创建者似乎忘记了这个细节。我相信,如果您取消设置

USE_CLOUD_SQL_AUTH_PROXY
环境变量,则示例在部署到 App Engine 时应该可以正常工作,因为默认情况下代码会从之前步骤中创建的
.env
文件中查找正确的 Unix 套接字。

echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env

只要未设置

USE_CLOUD_SQL_AUTH_PROXY
或设置为
None

,就应将其设置为默认值
DATABASES = {"default": env.db()}

我将提交一个错误来更新此代码示例。

© www.soinside.com 2019 - 2024. All rights reserved.