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いじれると便利。
参考
以下の記事を参考にしました。ありがとうございました。
コメント