google Colaboratory から GCP(GCE)上に立てたVMインスタンスにSSHで接続し、
そのVMインスタンス上にあるMySQLに接続したいのですが、うまくいきません。
同じコードで(SSH用の鍵の指定のみ変更)ローカルのVSCode上からだと問題なく
VMインスタンス上のMySQLへのアクセスはできています。
TestExecを実行すると、”SSH接続はうまくいった”まで表示されているので
SSH接続はうまく行っているようですが、MySQLへの接続部分で止まっているようです。
仕様上、SSH接続したローカルMySQLには接続できないのでしょうか?
それとも何かポート番号など、特別な処理が必要でしょうか?
はたまた、根本的にどこかロジックが誤っているのでしょうか。。
解決策が見つからず困っており、お知恵をお貸し頂けると助かります。
TestExec.py
Python
1sqlList = [] 2sqlList.append("select * from テーブル名;") 3SSHConnectionAndMySQLTestForGoogleColab.SQLExecutionForGoogleColab(sqlList)
Python
1import mysql.connector 2from sshtunnel import SSHTunnelForwarder 3 4def SQLExecutionForGoogleColab(sqlList): 5 HOST = 'GCP上のComputeEngineの外部IP' 6 PORT = 22 # SFTPのポート 7 USER = 'ユーザー名'#SSH接続の鍵に指定したユーザ名 8 DBUSER = 'DBに接続するユーザー名' 9 KEY_FILE = '秘密鍵のファイル' # 秘密鍵ファイル 10 DBNAME = 'データベース名前' 11 DBPORT = 3306 12 13 SSH_BASTION_ADDRESS = HOST #GCEの外部IP 14 SSH_PORT = PORT #GCEのPORT 15 SSH_USER = USER #秘密鍵に設定したユーザー名 16 # SSH_PKEY_PATH = os.path.expanduser('~/key.pem') # ここにsshで繋ぐときのキーファイルを指定する 17 SSH_PKEY_PATH = KEY_FILE #秘密鍵のパス 18 MYSQL_HOST = HOST # ここにGCEのパブリックIPアドレスを入れる 19 MYSQL_PORT = 3306 # MYSQLのポート番号 20 MYSQL_USER = DBUSER #MySQLのログインユーザ名 21 MYSQL_PASS = 'MySQLのログインパスワード' #MySQLのログインPW 22 MYSQL_DB = DBNAME #データベースの名前 23 24#SSH接続する 25 with SSHTunnelForwarder( 26 (SSH_BASTION_ADDRESS, SSH_PORT), 27 ssh_pkey=SSH_PKEY_PATH, 28 ssh_username=SSH_USER, 29 # ssh_password=PASSPHRASE, 30 remote_bind_address=('localhost', MYSQL_PORT), 31 local_bind_address=('localhost', MYSQL_PORT) 32 ) as ssh: 33 print("sshはうまくいった") 34 print(ssh.local_bind_port) 35 try: 36 #接続する 37 connection = mysql.connector.connect( 38 host='localhost', 39 port = ssh.local_bind_port, 40 user=MYSQL_USER, 41 passwd=MYSQL_PASS, 42 db=MYSQL_DB, 43 charset='utf8' 44 ) 45 print(connection.is_connected()) 46 print("DB接続もうまくいったっぽい") 47 # カーソルを取得する 48 cur = connection.cursor() 49 sql = "use DB名" 50 cur.execute(sql) 51 # rows = cur.fetchall() 52 # for row in rows: 53 # print(row) 54 55 for i in range(len(sqlList)): 56 print(sqlList[i]) 57 sql = str(sqlList[i]) 58 # sql = 'create table test (id int, content varchar(32))' 59 cur.execute(sql) 60 # #実行結果を取得する 61 rows = cur.fetchall() 62 for row in rows: 63 print(row) 64 except mysql.connector.Error as err: 65 print("Something went wrong: {}".format(err)) 66 connection.rollback() 67 raise err 68 finally: 69 #カーソルをクローズ 70 cur.close() 71 # 保存を実行 72 connection.commit() 73 #接続を終了 74 connection.close()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。