質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

GoogleComputeEngine

GoogleComputeEngineとは、Linux VMをGoogleのデータセンター上で走らせるIaaS (インフラストラクチャ アズ ア サービス)製品で、ビジネス向けクラウドコンピューティング基盤のことです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

704閲覧

google Colaboratory から GCP のVMインスタンス上のMySQLに接続したい

rjberger19

総合スコア33

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

GoogleComputeEngine

GoogleComputeEngineとは、Linux VMをGoogleのデータセンター上で走らせるIaaS (インフラストラクチャ アズ ア サービス)製品で、ビジネス向けクラウドコンピューティング基盤のことです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/10/03 15:11

編集2020/10/03 15:54

google Colaboratory から GCP(GCE)上に立てたVMインスタンスにSSHで接続し、
そのVMインスタンス上にあるMySQLに接続したいのですが、うまくいきません。

同じコードで(SSH用の鍵の指定のみ変更)ローカルのVSCode上からだと問題なく
VMインスタンス上のMySQLへのアクセスはできています。

TestExecを実行すると、”SSH接続はうまくいった”まで表示されているので
SSH接続はうまく行っているようですが、MySQLへの接続部分で止まっているようです。

仕様上、SSH接続したローカルMySQLには接続できないのでしょうか?
それとも何かポート番号など、特別な処理が必要でしょうか?
はたまた、根本的にどこかロジックが誤っているのでしょうか。。

解決策が見つからず困っており、お知恵をお貸し頂けると助かります。

以下の画面で止まります。。
GoogleColaboratoryの実行画面

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

connectionの確立方法を別のライブラリを使ってやることで理由は分かりませんが無事にできました。

Python

1import pymysql.cursors 2 3connection = pymysql.connect(host='localhost', user='user', password='password!', db='dbname', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

投稿2020/10/04 11:58

rjberger19

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問