PythonでAWS RDSに接続する

shintaro_toyoguchi
5 min readSep 23, 2016

--

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関連のファイルを根こそぎ落とせば解決(雑)。

--

--