[最終更新] 2018年9月20日
pythonのmysqlclientを使って、AWSのRDSにアクセスするやり方のメモ。普通、AWSのRDSはプライベートネットワーク内にあるため、インターネットに繋がっている踏み台のサーバーをSSHで経由する必要がある。
目次
やりたいこと
pythonのmysqlclientを使って、AWSのRDSにアクセスしてSQL文を実行したい。RDSはプライベートネットワークにあるため、踏み台となるサーバーをSSHで経由する。具体的には、下図のようなネットワーク構成となっている。

AP……アプリケーションサーバー……まぁアクセスポイントということで……。
サンプル
「データ分析環境からmysqlを叩いて高速な分析環境を用意する – Qiita」の記事を参考にさせていただき、以下のようなサンプルを作成した。踏み台サーバーをap、目的のRDSをrdsとした。
import MySQLdb
from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(
('apのIP', apのport),
ssh_host_key=None,
ssh_username='ec2-user',
ssh_password=None,
ssh_pkey='apの秘密鍵',
remote_bind_address=('rdsのエンドポイント', 3306),
local_bind_address=('127.0.0.1',10022)
) as tunnel:
conn = MySQLdb.connect(
host='127.0.0.1',
port=10022,
user='dbに繋ぐユーザ名',
db='db名',
passwd='dbのパスワード',
charset='utf8mb4'
)
c = conn.cursor()
# テストで実行するSQL文
c.execute("SELECT * FROM test_table")
for row in c.fetchall():
print(row)
conn.close()
local_bind_addressのIPは任意。ここでは10022にした。MySQLdb.connect()内のportと合わせる。
with文を使わない場合は、server = SSHTunnelForwarder( hogehoge ) として、適切なところにserver.start()およびserver.stop()を入れるとよい。
import MySQLdb
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
('apのIP', apのport),
ssh_host_key=None,
ssh_username='ec2-user',
ssh_password=None,
ssh_pkey='apの秘密鍵',
remote_bind_address=('rdsのエンドポイント', 3306),
local_bind_address=('127.0.0.1',10022)
)
server.start()
conn = MySQLdb.connect(
host='127.0.0.1',
port=10022,
user='dbに繋ぐユーザ名',
db='db名',
passwd='dbのパスワード',
charset='utf8mb4'
)
c = conn.cursor()
# テストで実行するSQL文
c.execute("SELECT * FROM test_table")
for row in c.fetchall():
print(row)
conn.close()
server.stop()
PythonでDBいじれると便利。
参考
以下の記事を参考にしました。ありがとうございました。
- データ分析環境からmysqlを叩いて高速な分析環境を用意する – Qiita
- MySQL – [Python3]SSH経由でMYSQLに接続できない(105038)|teratail
- Welcome to sshtunnel’s documentation! — sshtunnel 0.0.8 documentation
- pythonでsshtunnelする | 電脳手帳
関連記事
aws の記事
- [2018年7月12日] AWS Lambda + API Gateway で/hoge/{group}/{user}のように階層構造のREST APIでパスパラメータの受け渡し
- [2018年7月9日] AWS Lambda + API Gateway でREST APIを作成し、値を渡してDynamoDBに書き込んでついでに返り値を得るサンプル
- [2018年6月28日] AWS S3上のjsonファイルをgetJSONしたらNo ‘Access-Control-Allow-Origin’ header is present on the requested resourceと怒られた時の対応
- [2018年6月19日] AWSのELBでセッション維持の設定(スティッキーセッション)
- [2018年5月31日] MySQLクライアントでAWSのRDSに接続
- ---本記事---
- [2017年12月27日] 初心者がAWSでとりあえず最初にWebサーバー立ち上げるまで
Python の記事
- [2018年8月21日] boto3でS3にアップロードした画像が、ブラウザで表示するとダウンロードされてしまう時
- [2018年7月27日] Pandasで2列を比較してTrue/Falseの新たな列を作る。さらに1/0へのマッピング
- [2018年7月20日] pythonのpipで入れているもの
- [2018年6月25日] cronのpythonスクリプト内にあるjson.dump()でensure_ascii=Falseにして日本語出力しようとしてハマった
- [2018年6月22日] pythonでRSSフィードを取得し、画像がない場合、リンク先の記事から拾う
- ---本記事---
- [2018年5月17日] matplotlibでx軸の時刻情報をフォーマットする
- [2018年5月11日] Pythonでユニークでランダムな文字列のリストを作成する
- [2018年1月29日] Pandasでcsv, excelデータの読み込み・書き込み
- [2018年1月19日] pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ
- [2018年1月16日] Pythonでファイル・ディレクトリ操作
スポンサーリンク