Ошибка подключения Google Cloud Function к облачному SQL - PullRequest
0 голосов
/ 28 декабря 2018

Используя пример кода для подключения облачной функции к Cloud SQL, я успешно создал новую функцию с немного отличным выводом.Некоторое время он работал нормально.Теперь, без каких-либо изменений в коде, я получаю сообщение OperationalError: (2003, «Не удается подключиться к серверу MySQL на« localhost »([Errno 111] Соединение отклонено)»).Вот полная ошибка:

sql-test-function-1
szzv41dltb8k
Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/pymysql/connections.py", line 570, in connect sock.connect(self.unix_socket) ConnectionRefusedError: [Errno 111] Connection refused During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 297, in run_http_function result = _function_handler.invoke_user_function(flask.request) File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 199, in invoke_user_function return call_user_function(request_or_event) File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 192, in call_user_function return self._user_function(request_or_event) File "/user_code/main.py", line 50, in mysql_demo mysql_conn = pymysql.connect(**mysql_config) File "/env/local/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect return Connection(*args, **kwargs) File "/env/local/lib/python3.7/site-packages/pymysql/connections.py", line 327, in __init__ self.connect() File "/env/local/lib/python3.7/site-packages/pymysql/connections.py", line 629, in connect raise exc pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")

Я видел множество примеров людей, имеющих подобную проблему, как здесь, так и при поддержке Google GitHub, и испробовал все их решения (включение Cloud SQL Admin API, реализация ответа в этот вопрос Stackoverflow и т. Д.), Но я продолжаю получать ту же ошибку.Я попытался перезапустить экземпляр SQL, а также создать новую функцию с тем же кодом в окне Chrome Incognito, чтобы избежать проблем с кэшированием: та же ошибка.

Вот мой код для облачной функции:

from os import getenv

import pymysql
from pymysql.err import OperationalError

# TODO(developer): specify SQL connection details
CONNECTION_NAME = getenv(
  'INSTANCE_CONNECTION_NAME',
  'la-cloud-functions:us-central1:cf-sql-1')
DB_USER = getenv('MYSQL_USER', 'root')
DB_PASSWORD = getenv('MYSQL_PASSWORD', 'root')
DB_NAME = getenv('MYSQL_DATABASE', 'gallery')

mysql_config = {
  'user': DB_USER,
  'password': DB_PASSWORD,
  'db': DB_NAME,
  'charset': 'utf8mb4',
  'cursorclass': pymysql.cursors.DictCursor,
  'autocommit': True
}

# Create SQL connection globally to enable reuse
# PyMySQL does not include support for connection pooling
mysql_conn = None


def __get_cursor():
    """
    Helper function to get a cursor
      PyMySQL does NOT automatically reconnect,
      so we must reconnect explicitly using ping()
    """
    try:
        return mysql_conn.cursor()
    except OperationalError:
        mysql_conn.ping(reconnect=True)
        return mysql_conn.cursor()


def mysql_demo(request):
    global mysql_conn

    # Initialize connections lazily, in case SQL access isn't needed for this
    # GCF instance. Doing so minimizes the number of active SQL connections,
    # which helps keep your GCF instances under SQL connection limits.
    if not mysql_conn:
        try:
            mysql_conn = pymysql.connect(**mysql_config)
        except OperationalError:
            # If production settings fail, use local development ones
            mysql_config['unix_socket'] = f'/cloudsql/{CONNECTION_NAME}'
            mysql_conn = pymysql.connect(**mysql_config)

    # Remember to close SQL resources declared while running this function.
    # Keep any declared in global scope (e.g. mysql_conn) for later reuse.
    with __get_cursor() as cursor:
        cursor.execute('SELECT * from albums')
        row = cursor.fetchone()
        while row is not None:
          print(row)
          row = cursor.fetchone()

Если у кого-то есть какие-либо другие предложения, я был бы рад.

TIA - Джо

1 Ответ

0 голосов
/ 30 декабря 2018

Я решил это, воссоздав функцию в другом проекте.Я не уверен, почему экземпляр Cloud SQL разорвал соединение и не смог соединиться, но как только я восстановил соединение, я смог успешно повторно применить код из функции.Связь между функцией Cloud и Cloud SQL официально находится в стадии бета-тестирования, поэтому это может быть просто временным затруднением.

...