PythonでAWS RDSに接続する
AWSでMySQLのDBを用意し、そこにPythonを使って、EC2のAmazon Linuxサーバーを踏み台にして接続する方法
Python始めて1~2週間の法学部卒にはハードな内容だったので、備忘をば。
そもそもPythonって何
VBAしかやっていない人間からすると、配列の自由度の高さが最早謎の領域。詳細は詳しい人に聞きましょう。
動作環境
Windows 8.1 / Python 3.4
MySQL DBに繋ぐには
PythonからMySQL DBに繋ぐための方法はいくつかある模様。今回は本家MySQLが提供しているMySQL connectorを使うことに(読者「ちゃんと比較したのか?」筆者「…」)。
以下のサイトから、ちゃんとPythonのバージョンにあったものをインストール。(Pythonのバージョンが分からない時はコマンドプロンプトに「Python」と打ってEnterを押せば返ってくるが、ちゃんと環境変数に設定してないと云々…)
Linuxを踏み台にするには
これだけでは踏み台経由では繋がらないので、SSH tunnelをインストールすることで、それを実現する。
コマンドプロンプトを起動し(コマンドプロンプトのアイコンを右クリックして「管理者権限で起動」しないといけない可能性大。切り分けが面倒で未検証。)、そもそもpipが存在するか確認してみよう。「pipって何」という話だが、Pythonのバージョン3.4以降ではデフォルトで入っている、Pythonに入れるパッケージソフトウェアをインストール・管理するためのシステムらしいが、詳細は詳しい人に(ry
以下をコマンドプロンプトで打てば、インストールされているパッケージのリストが表示される。これでエラーとなればpipを先にインストールするべし。
>python -m pip list
で、早速SSH tunnelをインストールする。
>python -m pip install sshtunnel
無事終了したようであれば、先程のリスト表示を再実行してみれば、表示されるリスト内に「sshtunnel」がいるはず。いない場合は…どうするんでしょうね…
DBに接続するコードは
ここから先はAWSのコンソール画面も見つつ、実際のDBの情報をPythonのコードに書いていく。<>内は当方のコメント。
# -*- coding: utf-8 -*-
from sshtunnel import SSHTunnelForwarder
import mysql.connector
# SSH関連の設定
with SSHTunnelForwarder(
(“<EC2のパブリックIP>”, <EC2のポート番号 基本的に22?>),
ssh_host_key=None,
ssh_username=”<基本的にec2-userで良いはず>”,
ssh_password=None,
ssh_pkey=”<公開鍵ファイル(.pem)までのフルパス>”,
remote_bind_address=(“<RDS側のエンドポイント>”, <RDSのポート番号 基本的に3306>)
) as server: # RDSへの接続
cnn = mysql.connector.connect(host=”<RDS側のエンドポイント>”,
port=<RDSのポート番号 基本的に3306>,
db=”<DB名称>”,
user=”<ユーザー名称>”,
passwd=”<パスワード>”,
charset=”utf8")
cursor = cnn.cursor()# データベースから切断
cursor.close()
cnn.close()
RDS側のエンドポイントとは、「xxxxx.us-west-2.rds.amazonaws.com」のような文字列でRDSのコンソール画面で確認できるもの。ユーザーの名称、パスはAWSの画面でDB立てた時に入力した”あれ”である。
繋がらないんだけど
色々な問題が発生するのは付き物。恐らく全ての穴に引っかかった筆者の対策集を公開。
- 公開鍵のフルパスがどうのこうのみたいなエラーが出る
→フルパスに「\User…」みたいな「\U」等のエスケープ文字が入っている可能性を指摘してみる。「\\User」と「\」を重ねることで回避可能。
- 散々待たされたが、接続を確立できないだの何だのエラーが出る
→AWSコンソールで、EC2、RDS双方のセキュリティグループを確認してみるべし。大体設定漏れ。
- エラー停止した後、他の同じDBに接続するアプリケーションも挙動が不安定…?
→Python側でDBへの接続をきちんと切る前にエラー停止していると、そういうことに。Python関連のファイルを根こそぎ落とせば解決(雑)。