Невозможно подключить Google App Engine к CloudSQL Postgres (через SQLAlchemy) в облачной оболочке - PullRequest
0 голосов
/ 07 апреля 2019

Запуск небольшого веб-приложения в Google App Engine (гибкий) с использованием Python 3, Flask, SQLAlchemy, пакета psycopg2-binary и CloudSQL Postgres.Приложение правильно подключается к CloudSQL в моей локальной среде разработчика (я использую прокси-сервер), но при развертывании в облаке оно, похоже, не будет подключаться.

Работало нормально при первом развертывании на прошлой неделе.После установки обновления и повторного развертывания приложение больше не подключается к CloudSQL в облачной оболочке или при развертывании - даже после отката к предыдущей фиксации.Но он прекрасно подключается к моей локальной машине разработки с использованием прокси.

Я отладкой проверил, что необходимые учетные данные правильно вставлены в мой SQLALCHEMY_DATABASE_URI, а именно: postgres+psycopg2://[user]:[pw]@/[db_name]?host=/cloudsql/breadsheet:us-west1:breadsheet.

Единственное изменение, которое я сделал на платформе с момента первоначального развертывания, было обновление с Cloud Datastore до Firestore, откуда я извлекаю переменные среды для создания URI.Данные никогда не поступали из хранилища данных, поэтому это не должно иметь значения.

Я следую руководству по подключению GAE Postgres для 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"?

Пробовал следующее (и больше!) Безрезультатно:

  • Белый список различных IP-адресов в управлении CloudSQL
  • Настройка разрешений IAM
  • Использование nano для комментирования кода Firestore и жесткого кода URI
  • Использование nano для жесткого кодирования SQLALCHEMY_DATABASE_URI в env_variables в моем app.yaml

Что попробовать дальше?

1 Ответ

2 голосов
/ 16 апреля 2019

Для тех, кто читает это с помощью поиска в будущем, я ранее пропустил export SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://[USER]:[PW]@127.0.0.1:5432/[DB_NAME], потому что меня не особо волновала среда облачной оболочки и я предполагал, что это не повлияет на развертывание. По-видимому, это так.

Позже, при устранении неполадок соединения с БД в облачной оболочке, я обнаружил, что пропускаю первую часть (sudo mkdir /cloudsql;) этой двухэтапной команды sudo mkdir /cloudsql; sudo chmod 777 /cloudsql, поскольку я уже создал папку / cloudsql. Я до сих пор не уверен, зачем нужны обе части команды, особенно когда папка уже существует, но соединение с БД не помогло мне без них обоих.

Еще одно примечание: установка SQLALCHEMY_DATABASE_URI в env_variables: в app.yaml - это , а не , если вы задаете это значение в другом месте приложения. Добавление к env_variables: просто делает значение доступным в виде легко доступной переменной.

...