无法将Google App Engine(通过SQLAlchemy)连接到Cloud Shell中的CloudSQL Postgres

时间:2019-04-07 18:03:50

标签: python google-app-engine sqlalchemy google-cloud-sql

使用Python 3,Flask,SQLAlchemy,psycopg2-binary软件包和CloudSQL Postgres在Google App Engine(Flexible)上运行小型Web应用程序。该应用程序可以在我的本地开发环境中正确连接到CloudSQL(我使用代理),但是当部署在云中时似乎无法连接。

上周我第一次部署它时效果很好。推送更新并重新部署后,即使回滚到先前的提交,该应用也不再连接到Cloud Shell中或部署时的CloudSQL。但是它可以使用代理在我的本地开发机上正常连接。

我已经通过调试验证了必要的凭据已正确插入到我的SQLALCHEMY_DATABASE_URI中,即:postgres+psycopg2://[user]:[pw]@/[db_name]?host=/cloudsql/breadsheet:us-west1:breadsheet

自从最初的部署从Cloud Datastore升级到Firestore后,我在平台上所做的仅是更改,这是我从中提取环境变量以构建URI的地方。数据存储区从来没有数据,所以没关系。

我正在使用GAE Postgres connection guide(对于Unix)。这是我的app.yaml:

runtime: python
env: flex

instance_class: F1

entrypoint: gunicorn -w 1 breadsheet:breadapp

error_handlers:
  - file: app/templates/errors/default_error.html

  - error_code: over_quota
    file: app/templates/errors/over_quota.html

beta_settings:
  cloud_sql_instances: breadsheet:us-west1:breadsheet

这是当我从云壳中运行gunicorn时出现的错误:

(venv) [me]@cloudshell:~/breadsheet (breadsheet)$ gunicorn -w 1 breadsheet:breadapp
[2019-04-07 10:23:16 -0700] [471] [INFO] Starting gunicorn 19.9.0
[2019-04-07 10:23:16 -0700] [471] [INFO] Listening at: http://127.0.0.1:8000 (471)
[2019-04-07 10:23:16 -0700] [471] [INFO] Using worker: sync
[2019-04-07 10:23:16 -0700] [474] [INFO] Booting worker with pid: 474
2019-04-07 09:40:08,838 Exception on / [GET]
Traceback (most recent call last):
[...]
  File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 437, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/cloudsql/breadsheet:us-west1:breadsheet/.s.PGSQL.5432"?


The above exception was the direct cause of the following exception:
[line of code with the first database call in my app]
[...]
  File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/cloudsql/breadsheet:us-west1:breadsheet/.s.PGSQL.5432"?

尝试了以下(以及更多操作)无济于事:

  • 在CloudSQL管理中将各种IP列入白名单
  • 调整IAM权限
  • 使用nano注释掉Firestore代码并对URI进行硬编码
  • 使用nano在我的app.yaml中env_variables下对SQLALCHEMY_DATABASE_URI进行硬编码

接下来要尝试什么?

1 个答案:

答案 0 :(得分:1)

对于那些将来通过搜索阅读这些内容的人,我以前跳过了export SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://[USER]:[PW]@127.0.0.1:5432/[DB_NAME],因为我并不特别在意云外壳环境,并且认为它对部署没有影响。显然是这样。

稍后,在对Cloud Shell中的数据库连接进行故障排除时,我发现自己跳过了此两步命令sudo mkdir /cloudsql;的第一部分(sudo mkdir /cloudsql; sudo chmod 777 /cloudsql),因为我已经创建了/ cloudsql文件夹。我仍然不确定为什么需要命令的两个部分-尤其是在文件夹已经存在的情况下-但是如果没有这两个部分,数据库连接对我来说是行不通的。

更多说明:不需要在app.yaml中的SQLALCHEMY_DATABASE_URI下设置env_variables:,前提是您将该值设置为在应用的其他位置。添加到env_variables:只会使该值作为易于访问的变量可用。