GCP в стандартной среде: отказано в соединении с MySQL db - PullRequest
0 голосов
/ 13 сентября 2018

Моя цель - взять работающий проект Python 2.7 (файлы MySQL + MS Word) для работы в GCP. Я понимаю, что мне нужно

  1. App Engine - где будет работать приложение (масштабирование и т. Д.).
  2. Облачный SQL, работающий как MySQL db. Для этого я следовал этому Cloud SQL для MySQL tut и
    • Облачный экземпляр SQL создается с root пользователем.
    • Приложение App Engine и экземпляр Cloud SQL находятся в одном проекте.
  3. Облачное хранилище

Экземпляр второго поколения 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 , не так ли?

1 Ответ

0 голосов
/ 09 ноября 2018

Приложение GAE и экземпляр Google Cloud SQL должны быть развернуты в одном регионе , если вы используете MySQL First Generation , в противном случае я убедился, что они могут находиться в разных регионах, пока вы ' повторно использовать MySQL второго поколения.

У меня были проблемы с пониманием, откуда вы пытаетесь соединиться. Я предполагаю, что вы хотите подключиться из Google Cloud Shell, используя прокси-сервер и Cloud SDK Credentials . Согласно документации относительно Cloud SQL Proxy :

Cloud SQL Proxy обеспечивает безопасный доступ к вашему Cloud SQL Second Создание экземпляров без внесения в белый список IP-адресов или настроить SSL.

Облачный прокси-сервер SQL работает с локальным клиентом, который называется прокси, работает в местной среде. Ваше приложение связывается с прокси со стандартным протоколом базы данных, используемым вашей базой данных. Прокси-сервер использует безопасный туннель для связи со своим компаньоном процесс запущен на сервере.

Помните, что поскольку вы не развертываете приложение, оно не использует переменные среды, которые вы установили в app.yaml. Поэтому вы должны экспортировать и установить их самостоятельно на локальном компьютере:

export CLOUDSQL_CONNECTION_NAME=your-connection-name
export CLOUDSQL_USER=root
export CLOUDSQL_PASSWORD=xxxxx

Убедитесь, что они установлены, например, echo $CLOUDSQL_CONNECTION_NAME. При развертывании приложения с помощью gcloud app deploy в этом нет необходимости, поскольку GAE устанавливает любые переменные среды, указанные в app.yaml.

Прокси должен быть запущен перед попыткой установить соединение после следующих шагов:

Скачать прокси с:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy

Дайте разрешение на выполнение с:

chmod +x cloud_sql_proxy

Запустите прокси, заменив <INSTANCE_CONNECTION_NAME> именем подключения вашего экземпляра Cloud SQL:

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306

В конце вы должны увидеть что-то похожее на это:

 2018/11/09 13:24:32 Rlimits for file descriptors set to {&{8500 1048576}} 
 2018/11/09 13:24:35 Listening on 127.0.0.1:3306 for my-project:cloud-sql-region:cloud-sql-name 
 2018/11/09 13:24:35 Ready for new connections

В этот момент вы можете подключиться к прокси, работающему локально, из экземпляра Google Cloud Shell , который, в свою очередь, подключит вас к экземпляру Cloud SQL.

Откройте еще одну сессию Cloud Shell (или вкладку) и запустите свой код с помощью python myapp.py. Вы будете подключены к прокси, работающему локально. Вы также можете проверить соединение, запустив mysql -h 127.0.0.1 --user=root -p.

...