Подключение к базе данных MySQL через SSH (через хост перехода) с использованием Python 3 - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь установить соединение между python и моей базой данных MySQL (которая находится в AWS).

Туннель SSH работает нормально, дело обстоит, если потом начнется подключение к базе данных. Вот мой код:

из sqlalchemy import create_engine из sshtunnel import SSHTunnelForwarder

Вот мой код:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

tunnel.start()
print("SSH connection created..")   #until here it works fine.
port = str(tunnel.local_bind_port)
engine = create_engine("mysql+pymysql://db-username:db-pw@db-url"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)
connection = engine.connect()

После попытки подключения к базе данных он показывает следующееошибка:

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, «Не удается подключиться к серверу MySQL по db-url

До того, как я создал хост перехода,Строка подключения работала нормально.

1 Ответ

0 голосов
/ 15 октября 2019

С этим оператором:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

SSH-туннель установлен на ssh-host на порту 22, и удаленная конечная точка туннеля получает указание подключиться к базе данных. сервер работает на база данных-хост на порт db-порт (например, 3306). Но важно отметить, что этот туннель устанавливается только после того, как клиент установит соединение.

Но как клиент устанавливает соединение, спросите вы? Ну, часть функциональности SSHTunnelForwarder заключается в том, что он прослушивает соединения через случайный порт на локальном хосте. Поэтому, когда вы подключаетесь к localhost с помощью клиентского приложения (это происходит при вызовах create_engine () и engine.connect () ), SSH-туннель будет считывать данные из этого подключения. протолкните его через туннель и доставьте его на удаленную конечную точку на той стороне туннеля (т. е. сервер базы данных на хосте базы данных: db-порт).

Итак, что вам не хватает в вашем коде, так этосоединение с базой данных должно быть нацелено на localhost, как показано ниже (вы должны использовать IP-адрес 127.0.0.1 или имя хоста localhost ):

engine = create_engine("mysql+pymysql://db-username:db-pw@127.0.0.1:"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)
...