python не смог подключиться к базе данных через psycopg2

Я пытаюсь подключиться к postgresql через ssh-туннель с python3 как:

import psycopg2

from sshtunnel import SSHTunnelForwarder

class Database(object):

        def connect_to_database(self):
               remote_server = '50.100.200.240'
               private_server = 'test.amazonaws.com'

                with SSHTunnelForwarder((remote_server, 22),
                            ssh_username='user',
                            ssh_pkey='/key.pem',
                            remote_bind_address=(private_server,
                                                 5432)) as server:
        server.start()
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        k = paramiko.RSAKey.from_private_key_file("/key.pem")
        client.connect(remote_server, 22, pkey=k, username='user')

        print('server connected via ssh')
        conn = psycopg2.connect(host=private_server,
                                user='user',
                                password='pass',
                                database='test',
                                port=5432)
        curs = conn.cursor()
        curs.execute("SELECT version();")
        print(curs.fetchone())
        print('database connected!')

Я думаю, что ssh работает нормально, но я получаю следующую ошибку:

psycopg2.OperationalError: не удалось подключиться к серверу: время ожидания операции истекло. Сервер работает на хосте «host-url» (x.x.x.xxx) и принимает соединения TCP/IP через порт 5432?

Я также пробовал следующее предложение, но не повезло. https://www.nkallfa.com/2017/09/18/connecting-to-a-remote-postgresql-database-with-python/


person Payam    schedule 04.04.2019    source источник
comment
Можете ли вы подключиться к вашей базе данных с помощью клиента Postgres?   -  person Arkhena    schedule 04.04.2019
comment
Ваш код не имеет смысла. Открытие простого соединения SSH никак не влияет на соединение с базой данных. Вы должны использовать переадресацию портов. --- См. Как подключиться к базе данных через Paramiko Tunnel (или аналогичный пакет)   -  person Martin Prikryl    schedule 04.04.2019
comment
@Архена, да, я могу   -  person Payam    schedule 04.04.2019
comment
@MartinPrikryl Спасибо, посмотрю   -  person Payam    schedule 04.04.2019
comment
Я следовал предложенному обходному пути, но все еще та же ошибка @MartinPrikryl   -  person Payam    schedule 05.04.2019
comment
Покажите нам, что вы пробовали + Это не обходной путь, это правильное решение.   -  person Martin Prikryl    schedule 05.04.2019
comment
ну в моем случае это не правильное решение. Я перешел на использование SSHTunlelForwarder. SSH-соединение установлено корректно. Ошибка возникает, когда psycopg2 пытается подключиться к хосту, как также объяснялось выше. psycopg2.OperationalError: не удалось подключиться к серверу: время ожидания операции истекло. Сервер работает на хосте host-url (x.x.x.xxx) и принимает соединения TCP/IP через порт 5432?   -  person Payam    schedule 05.04.2019
comment
Покажи нам свой код!   -  person Martin Prikryl    schedule 05.04.2019
comment
проверьте код в описании, обновлен для использования SSHTunnelForwarder @MartinPrikryl   -  person Payam    schedule 05.04.2019
comment
Что ж, использование x.x.x.x в ситуации, когда вам нужно использовать как минимум три разных IP-адреса/имени хоста, не поможет нам сказать вам, что в этом случае вы сделали ошибку! Вы должны сообщить нам, какие адреса вы использовали в разных местах и ​​почему. Но ваш код определенно неверен, даже если вы использовали правильный IP-адрес (что вы, вероятно, в любом случае не так), поскольку вы не подключаетесь к номеру переадресованного порта. См., в частности, этот пример: sshtunnel.readthedocs.io/en/latest/#example-2 и ответ на повторяющийся вопрос stackoverflow.com/a/4039091/850848   -  person Martin Prikryl    schedule 05.04.2019
comment
Я не могу поделиться реальными IP-адресами, но я обновил свой код с помощью фиктивных IP-адресов, логика такая же (улучшенная). @МартинПрикрыл   -  person Payam    schedule 05.04.2019
comment
1) Исправить отступ кода. 2) Вы повторно добавили SSHClient - это бессмысленно - вам нужен только SSHTunnelForwarder 3) psycopg2.connect должен подключаться к хосту localhost и перенаправленному порту server.local_bind_port. Снова см. ссылки в моем предыдущем комментарии.   -  person Martin Prikryl    schedule 05.04.2019
comment
Спасибо @MartinPrikryl! теперь это работает, у меня не было local_bind_address в SSHTunnelForwarder.   -  person Payam    schedule 05.04.2019
comment
Вам не нужен local_bind_address, он выбирается автоматически. Вы можете использовать server.local_bind_port для получения выбранного порта. На самом деле это лучше, так как позволяет избежать конфликтов с другим программным обеспечением, которое может использовать тот же локальный порт, который в противном случае был бы жестко запрограммирован на local_bind_address.   -  person Martin Prikryl    schedule 05.04.2019
comment
Как видите, это было правильное решение.   -  person Martin Prikryl    schedule 05.04.2019
comment
да правда :) еще раз спасибо! @МартинПрикрыл   -  person Payam    schedule 05.04.2019