Python MySQL AWS — SSHTunnelForwarder — Исключение канала(2, «Не удалось подключиться»)

#python #pymysql

Вопрос:

Я пытаюсь подключиться к базе данных MySQL в AWS на своем локальном компьютере.

Ниже приведен код, который я использовал. Я «вычеркнул» конфиденциальную информацию.

 import pymysql import pandas as pd from paramiko import SSHClient from sshtunnel import SSHTunnelForwarder  ssh_host = '54.x.x.x' ssh_port = 22 ssh_username = 'xxxx' ssh_pkey = paramiko.RSAKey.from_private_key_file('keys/xxxx.pem') sql_host = '10.x.x.x' sql_port = 3036 sql_username = 'xxxx' sql_password = 'xxxx' sql_db = 'xxxx' local_host = '127.0.0.1'  with SSHTunnelForwarder(  (ssh_host, ssh_port),  ssh_username=ssh_username,  ssh_pkey=ssh_pkey,  remote_bind_address = (sql_host, sql_port)  ) as tunnel:  dbconn = pymysql.connect(host=local_host,  user=sql_username,  passwd=sql_password,  db=sql_db,  port=tunnel.local_bind_port)  

Я получаю следующую ошибку:

 2021-10-29 13:07:46,737| ERROR | Secsh channel 0 open FAILED: Connection refused: Connect failed 2021-10-29 13:07:46,753| ERROR | Could not establish connection from local ('127.0.0.1', 63918) to remote ('10.x.x.x', 3036) side of the tunnel: open new channel ssh error: ChannelException(2, 'Connect failed') --------------------------------------------------------------------------- OperationalError Traceback (most recent call last) C:Users...Temp/ipykernel_13796/2110950023.py in lt;modulegt;  5 remote_bind_address = (sql_host, sql_port)  6 ) as tunnel: ----gt; 7 dbconn = pymysql.connect(host=local_host,  8 user=sql_username,  9 passwd=sql_password,  ~Miniconda3envs...libsite-packagespymysqlconnections.py in __init__(self, user, password, host, database, unix_socket, port, charset, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db)  351 self._sock = None  352 else: --gt; 353 self.connect()  354   355 def __enter__(self):  ~Miniconda3envs...libsite-packagespymysqlconnections.py in connect(self, sock)  630 self._next_seq_id = 0  631  --gt; 632 self._get_server_information()  633 self._request_authentication()  634   ~Miniconda3envs...libsite-packagespymysqlconnections.py in _get_server_information(self)  1053 def _get_server_information(self):  1054 i = 0 -gt; 1055 packet = self._read_packet()  1056 data = packet.get_all_data()  1057   ~Miniconda3envs...libsite-packagespymysqlconnections.py in _read_packet(self, packet_type)  690 buff = bytearray()  691 while True: --gt; 692 packet_header = self._read_bytes(4)  693 # if DEBUG: dump_packet(packet_header)  694   ~Miniconda3envs...libsite-packagespymysqlconnections.py in _read_bytes(self, num_bytes)  746 if len(data) lt; num_bytes:  747 self._force_close() --gt; 748 raise err.OperationalError(  749 CR.CR_SERVER_LOST, "Lost connection to MySQL server during query"  750 )  OperationalError: (2013, 'Lost connection to MySQL server during query')  

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

Я нахожусь в Windows 10, среде Python Anaconda.

Обновление(2021.11.10): Я могу подключиться к MySQL через DBeaver, используя те же настройки.

Комментарии:

1. Я вижу, вы используете это для подключения ssh_host = ’54.x.x.x’. Возможно, сервер был остановлен, а затем запущен, и общедоступный IP-адрес для машины изменился.

2. @TobievanderMerwe, адрес сервера не изменился. Я могу подключиться к серверу SSH через командную строку.