Не удается подключить Google App Engine к CloudSQL Postgres (через SQLAlchemy) в облачной оболочке

#python #google-app-engine #sqlalchemy #google-cloud-sql

#python #google-app-engine #sqlalchemy #google-cloud-sql

Вопрос:

Запуск небольшого веб-приложения на 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 .

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

Я следую руководству по подключению GAE Postgres для Unix. Вот мое приложение.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. Разве в SQLALCHEMY_DATABASE_URI не должно быть ‘unix_socket’, а не ‘host’?

2. Можете ли вы попробовать принудительно использовать следующий движок для вашего подключения?: 'ENGINE': 'django.db.backends.postgresql_psycopg2'

3. Попытка с помощью ‘unix_socket’ и ‘unix_sock’ привела к следующему: psycopg2.ProgrammingError: invalid dsn: invalid connection option "unix_socket" .

4. Снова последовал этому руководству — на этот раз до T — и был успешным. Спасибо! Для тех, кто читает это через поиск в будущем, я пропустил export SQLALCHEMY_DATABASE_URI=postgresql psycopg2://[USER]:[PW]@127.0.0.1:5432/[DB_NAME] ранее, потому что я не особенно заботился о среде облачной оболочки и предполагал, что это не повлияет на развертывание. (Кстати: установка SQLALCHEMY_DATABASE_URI в поле env_variables: в app.yaml не требуется, при условии, что вы установили это значение в другом месте вашего кода. Я храню свои ключи app amp; db в Firestore и создаю их с помощью кода.)

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

Ответ №1:

Для тех, кто читает это через поиск в будущем, я ранее пропустил 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: просто делает значение доступным как легкодоступную переменную.

Комментарии:

1. значит, вы не используете «{}/.s.PGSQL.5432».format (unix_socket_path)? вы используете 127.0.0.1: 5432 для подключения, даже при развертывании на App Engine?