pythonのmysqlclientでSSH越しにAWSのRDSにアクセス

[最終更新] 2018年6月17日

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いじれると便利。

参考

以下の記事を参考にしました。ありがとうございました。

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。