#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?