Моя цель - взять работающий проект Python 2.7 (файлы MySQL + MS Word) для работы в GCP.
Я понимаю, что мне нужно
- App Engine - где будет работать приложение (масштабирование и т. Д.).
- Облачный SQL, работающий как MySQL db.
Для этого я следовал этому Cloud SQL для MySQL tut и
- Облачный экземпляр SQL создается с
root
пользователем.
- Приложение App Engine и экземпляр Cloud SQL находятся в одном проекте.
- Облачное хранилище
Экземпляр второго поколения SQL успешно создан и установлен пользователь root .
Как запустить или развернуть
Я использую Cloud Shell для тестирования приложения - dev_appserver.py $PWD
и развертывания приложения из Cloud Shell - gcloud app deploy
. Он работает на appspot.com , пока я не попытаюсь использовать в нем соединение MySQL.
MySQL соединение
Код подключения MySQL взят из здесь :
import MySQLdb
import webapp2
CLOUDSQL_CONNECTION_NAME = os.environ.get('CLOUDSQL_CONNECTION_NAME')
CLOUDSQL_USER = os.environ.get('CLOUDSQL_USER')
CLOUDSQL_PASSWORD = os.environ.get('CLOUDSQL_PASSWORD')
DB_NAME='test-db'
def connect_to_cloudsql():
# When deployed to App Engine, the `SERVER_SOFTWARE` environment variable
# will be set to 'Google App Engine/version'.
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
# Connect using the unix socket located at
# /cloudsql/cloudsql-connection-name.
cloudsql_unix_socket = os.path.join(
'/cloudsql', CLOUDSQL_CONNECTION_NAME)
db = MySQLdb.connect(
unix_socket=cloudsql_unix_socket,
user=CLOUDSQL_USER,
passwd=CLOUDSQL_PASSWORD)
# If the unix socket is unavailable, then try to connect using TCP. This
# will work if you're running a local MySQL server or using the Cloud SQL
# proxy, for example:
#
# $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
#
else:
db = MySQLdb.connect(
host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD, db=DB_NAME)
return db
db = connect_to_cloudsql()
Переменные задаются в app.yaml :
runtime: python27
api_version: 1
threadsafe: true
env_variables:
CLOUDSQL_CONNECTION_NAME: coral-heuristic-215610:us-central1:db-basic-1
CLOUDSQL_USER: root
CLOUDSQL_PASSWORD: xxxxx
Когда приложение запускается в тестовом режиме до dev_appserver.py $PWD
, и я выбираю использовать соединение MySQL, я получаю сообщение об ошибке:
ERROR 2018-09-13 08:37:42,492 wsgi.py:263]
Traceback (most recent call last):
...
File "/home/.../mysqldb.py", line 35, in connect_to_cloudsql
host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD)
File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 204, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2003, 'Can\'t connect to MySQL server on \'127.0.0.1\' (111 "Connection refused")')
Облачный прокси SQL
Я скачал и запустил Cloud Proxy для Win-64 (https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe), но проблема все еще сохраняется ... Кажется, что фоновое приложение прокси предназначено только для подключения к Cloud SQL с моего локального компьютера.
Вам не нужно использовать прокси или настраивать SSL для подключения к Cloud SQL из стандартной или гибкой среды App Engine. ( источник )
Почему отказано в соединении?
Должен ли я использовать первый экземпляр Cloud sql первого поколения для упрощения соединения с App Engine?
Обновление 1
Я редактирую код в Cloud Console, и пока Cloud Console работает хорошо.
Обновление 2
Мне удалось подключиться к экземпляру sql через Cloud Shell:
(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 48841
Server version: 5.7.14-google-log (Google)
MySQL [(none)]>
Обновление 3
Комментарий к аналогичной проблеме касается регионов, в которых экземпляр SQL Cloud и приложение App Engine должно быть, то есть в том же регионе .
В моем случае я проверил:
- Облачный экземпляр SQL для подключения: us-central1-a
- Приложение App Engine: us-central
Это из одного региона? - получилось это из одного региона .
Обновление 4
Я мог бы выяснить, как открыть соединение с БД:
DB connection: <_mysql.connection open to '127.0.0.1' at 7f628c02bc00>
Но, похоже, это произошло только после того, как я открыл еще один экземпляр Cloud Shell с тем же проектом ( coral-heuristic-215610 ). В этом случае я установил соединение с экземпляром SQL, и оно прошло успешно:
(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Я полагаю, что первый экземпляр облачной оболочки начал подключаться к базе данных, потому что второй экземпляр занес в белый список мой IP , не так ли?