Подключите контейнер Cloud Run к облаку SQL - PullRequest
0 голосов
/ 20 марта 2020

ОБНОВЛЕНИЕ:

Я перепроверил пример проекта GoogleCloudPlatform и повторил попытку. Внезапно, это работает.

Половина моей проблемы была связана с тем фактом, что мой целевой проект использует Flask -SQLAlchemy. Для этого мне нужно было использовать диалект MySQLdb, как показано в этом ответе: { ссылка }

Я до сих пор не уверен, почему мне не удалось заставить работать пример GoogleCloudPlatform в первый раз и почему он вдруг начал работать после того, как я снова разветвился.

Исходное сообщение:

Я пытаюсь подключить контейнер, работающий в Cloud Run, к Cloud SQL используя следующее руководство: https://cloud.google.com/sql/docs/mysql/connect-run?hl=en_US

Я сделал следующее:

  • Включите API для моего проекта
  • Добавьте роль «Cloud SQL Client» в мою учетную запись службы REDACTED-compute@developer.gserviceaccount.com

Однако соединение не устанавливается со следующей ошибкой:

File "/ usr / local / lib / python3 .8 / site-packages / pymysql / connections.py ", строка 630, в connect connect ex c sqlalchemy.ex c .OperationalError: (py mysql .err. OperationalError) (2003, «Не удается подключиться к MySQL серверу на локальном хосте ([Errno 2] Нет такого файла или каталога)»)

Я предпринял вторую попытку спойте пример кода из GitHub: https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/cloud-sql/mysql/sqlalchemy

Вот шаги, которые я выполнил:

  1. Отразил хранилище и сделал его приватным
  2. Отредактировал app.yaml, чтобы добавить мои учетные данные, аналогичные приведенным ниже (я не заключил значения в кавычки - не так ли?):
env_variables:
  CLOUD_SQL_CONNECTION_NAME: my-project-270323:us-central1:database
  DB_USER: root
  DB_PASS: areallygreatpassword
  DB_NAME: database
Подключил репозиторий к Cloud Build и запустил новую сборку Развернул мой контейнер в новой службе в Cloud Run, выбрав по базе данных пункт Подключения> Облако SQL Подключения

Я получаю ту же ошибку. Что я делаю не так?

РЕДАКТИРОВАТЬ

Вот полный дамп ошибок:

Traceback (most recent call last):()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app response = self.full_dispatch_request()()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1944, in full_dispatch_request self.try_trigger_before_first_request_functions()()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1992, in try_trigger_before_first_request_functions func()()
File "/app/main.py", line 81, in create_tables with db.connect() as conn:()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2209, in connect return self._connection_cls(self, **kwargs)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 103, in __init__ else engine.raw_connection()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2306, in raw_connection return self._wrap_pool_connect(()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2279, in _wrap_pool_connect Connection._handle_dbapi_exception_noconnection(()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1547, in _handle_dbapi_exception_noconnection util.raise_from_cause(sqlalchemy_exception, exc_info)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 152, in reraise raise value.with_traceback(tb)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect return fn()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 303, in unique_connection return _ConnectionFairy._checkout(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 773, in _checkout fairy = _ConnectionRecord.checkout(pool)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 492, in checkout rec = pool._do_get()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 139, in _do_get self._dec_overflow()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ compat.reraise(exc_type, exc_value, exc_tb)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 153, in reraise raise value()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get return self._create_connection()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection return _ConnectionRecord(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 437, in __init__ self.__connect(first_connect_check=True)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 652, in __connect connection = pool._invoke_creator(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect return dialect.connect(*cargs, **cparams)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 489, in connect return self.dbapi.connect(*cargs, **cparams)()
File "/usr/local/lib/python3.8/site-packages/pymysql/__init__.py", line 94, in Connect return Connection(*args, **kwargs)()
File "/usr/local/lib/python3.8/site-packages/pymysql/connections.py", line 325, in __init__ self.connect()()
File "/usr/local/lib/python3.8/site-packages/pymysql/connections.py", line 630, in connect raise exc sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 2] No such()
File or directory)")

Кроме того, я сделал это через веб-консоль, не CLI. Вот настройки, которые я передал в пример проекта, предоставленный Google:

drive.google.com / open? Id = 17nl_rQVTU2ZirCEu64bjfe90zGweg3a6 drive.google.com/open?id=1_Riy1HNSPvZZUGl4tJ0Z8puYuuMbUMPH10

1 Ответ

0 голосов
/ 20 марта 2020

Вопрос включает в себя несколько масштабных исследований, хорошо сделано. Непосредственное обращение к двум точкам:

  • Файл app.yaml задает c для App Engine и является способом передачи конфигурации переменной среды в ваше приложение. В Cloud Run вы используете флаг - update-env-vars при развертывании.
  • Возможно, вы также пропускаете флаг в операции развертывания службы: --add-cloudsql-instances INSTANCE-CONNECTION-NAME

Эти шаги вместе:

gcloud run deploy SERVICE --image gcr.io/PROJECT/SERVICE \
  --add-cloudsql-instances my-project-270323:us-central1:database
  --update-env-vars CLOUD_SQL_CONNECTION_NAME=my-project-270323:us-central1:database \
  --update-env-vars DB_USER=root \
  --update-env-vars DB_PASS=areallygreatpassword \
  --update-env-vars DB_NAME=database

Обратите внимание, что database в INSTANCE_CONNECTION_NAME является экземпляром Cloud SQL, тогда как database в качестве DB_NAME является базой данных, созданной в этом экземпляре.

Значения конфигурации необходимо использовать как часть создания соединения с базой данных.

Вы можете увидеть больше связи между этими переменными среды и созданием объекта соединения в полном примере кода на Github .

...