Подключение к CloudSQL из потока данных в Python

Я пытаюсь подключиться к CloudSQL с помощью конвейера Python.


Актуальная ситуация

  • Я могу сделать это без проблем с помощью DirectRunner
  • Не могу подключиться с помощью DataflowRunner

Функция подключения

def cloudSQL(input):
    import pymysql
    connection = pymysql.connect(host='<server ip>',
                                   user='...',
                                   password='...',
                                   db='...')
    cursor = connection.cursor()
    cursor.execute("select ...")
    connection.close()
    result = cursor.fetchone()
    if not (result is None):
        yield input

Ошибка

Это сообщение об ошибке при использовании DataflowRunner

OperationalError: (2003, "Can't connect to MySQL server on '<server ip>' (timed out)")

CloudSQL

У меня есть publicIP (для тестирования с локального с помощью directrunner), и я также пытался активировать частный IP, чтобы узнать, может ли это быть проблемой для подключения к DataflowRunner


Вариант 2

Я также пробовал с

connection = pymysql.connect((unix_socket='/cloudsql/' + <INSTANCE_CONNECTION_NAME>,
                               user='...',
                               password='...',
                               db='...')

С ошибкой:

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 2] No such file or directory)")
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
2 618
4

Ответы 4

Взгляните на Прокси-сервер Cloud SQL. Он создаст локальную точку входа (сокет Unix или порт TCP в зависимости от того, что вы настроите), которая будет прокси-сервером и аутентифицировать соединения с вашим экземпляром Cloud SQL.

Вы знаете, возможно ли это с помощью файла setup.py? если возможно, знаете ли вы какой-нибудь пример, чтобы увидеть код?

IoT user 19.12.2018 09:31

Прокси-сервер - это внешний процесс, который вы запускаете рядом со своим приложением.

kurtisvg 19.12.2018 19:06

Вам нужно будет имитировать реализацию JdbcIO.read () в Python, как описано в этом StackOverflow ответ

С этим решение я смог получить доступ к CloudSQL.

Для тестирования вы можете добавить 0.0.0.0/0 в CloudSQL publicIP без использования сертификатов.

Я создал пример с использованием Cloud SQL Proxy внутри контейнера Workflow worker, подключение из конвейера Python с использованием сокетов Unix без необходимости SSL или IP-авторизации.

Таким образом, конвейер может подключаться к нескольким экземплярам Cloud SQL.

https://github.com/jccatrinck/dataflow-cloud-sql-python

Есть снимок экрана, показывающий вывод журнала, на котором в качестве примера показаны таблицы базы данных.

Другие вопросы по теме