SSHTunnelを使ったmysql serverへの接続でタイムアウトエラー
SSHTunnelを使って、mysql serverに接続しようとしています。
構成は A:自宅のPC、 B:sshするサーバ、 C:mysqlが立っているサーバ、となっており、A→B→Cの順番に繋げようとしています。
Cのmysqlの立っているサーバは、Bのサーバのipアドレスからのみアクセスできるように設定してあります。
そのため、SSHTunnelを使って、Bを経由して、Cのサーバに接続を試みようとしています。
以下のコードを実行すると、タイムアウトになってしまい、2003のエラーがでます。
Portが違っているとタイムアウトになると思いますが、Cのサーバはmysqlサーバ標準の3306でアクセスできるようになっています。
remote_bind_address、local_bind_addressなどが怪しいと思っていますが、エラーがでてしまう原因は分かるでしょうか。
因みにterminal上で次のようなことを実行した場合は問題なく、mysql serverにアクセスできます。
ssh ssh_user@ssh_server_host_name -p 22
mysql -h mysql_server_host_name -P 3306 -u mysql_user -p
python3.7での実装
# -*- coding: utf-8 -*-
from sshtunnel import SSHTunnelForwarder
# モジュール読み込み
import pymysql.cursors
# SSH関連の設定
with SSHTunnelForwarder(
("ssh_server_host_name", 22),
ssh_username="ssh_user",
ssh_password="ssh_pass",
remote_bind_address=('mysql_server_host_name', 3306)
) as server:
print("connected server")
# # MySQLに接続する
conn = pymysql.connect(host='mysql_server_host_name',
user='mysql_user',
password='pass',
db='db_name',
charset='utf8',
port=server.local_bind_port,
cursorclass=pymysql.cursors.DictCursor)
# select
# SQLを実行する
cursor = conn.cursor()
sql = "show tables"
cursor.execute(sql)
# Select結果を取り出す
rets = cursor.fetchall()
for r in rets:
print(r)
# MySQLから切断する
conn.close()
エラーメッセージ
Traceback (most recent call last):
File "/Users/user/venv/lib/python3.7/site-packages/pymysql/connections.py", line 582, in connect
**kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 727, in create_connection
raise err
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 716, in create_connection
sock.connect(sa)
socket.timeout: timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/user/PycharmProjects/bitflyerPredict/database.py", line 25, in <module>
cursorclass=pymysql.cursors.DictCursor)
File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect
return Connection(*args, **kwargs)
File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/connections.py", line 327, in __init__
self.connect()
File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/connections.py", line 629, in connect
raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '(hostname)' (timed out)")