はじめに
開発では、変なところからアクセスされたくないためにDBにアクセスできるサーバを制限しています。
アクセスできるサーバのことを踏み台といいますが、基本的には中継地点になるだけなので開発に便利なソフトウェアがほとんど入っていません。
そこで、トンネルのようにローカルのPCと目的のDBまでの通信を踏み台は通すだけにして、実際の処理はローカルのPCで行うsshトンネルというものが良く使用されます。
sshクライアントで有名なteratermでも可能ですが、業務の自動化の一環で使用したpythonでのsshトンネルの方法をまとめます。
環境
- python3:3.6.5
- sshtunnel:0.4.0
sshtunnelのインストール
sshトンネルを作成するためにsshtunnelを使用します。
sshtunnelのインストールは普通にpipでインストールすれば良いだけです。
pip install sshtunnel
sshtunnelの使い方
sshtunnelは以下の手順で使用します。
- sshの設定
- sshトンネルのスタート
- DBなどバインド先に対してしたい処理
- sshトンネルのクローズ
sshtunnelの設定
設定内容
sshトンネルは図のように踏み台サーバを通してDBに接続するため、必要な設定は7つあります。
- 踏み台へログインするための情報
- 踏み台のIPアドレス(上絵の例:192.168.1.0)
- 踏み台へログインするためのユーザID
- 踏み台へログインするためのパスワードまたはキーファイルのパス
- ローカルPCと踏み台間の設定
- ローカルPCのIPアドレス(上絵の例:0.0.0.0)
- ローカルPCにバインドするポート番号(上絵の例:400)
- 踏み台とDB間の設定
- DBのIPアドレス(上絵の例:192.168.2.0)
- 踏み台にバインドするポート番号(上絵の例:5432)
設定方法
設定方法は簡単です。sshtunnelをimportしてSSHTunnelForwarderに与えてあげるだけです。
local_bind_addressでポートを指定しないときは自動的に空いているポートが使用されます。使用されたポートを知るためにはserver.local_bind_portで知ることができます。
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder((
192.168.1.0,
22
),
ssh_username='login_user,
ssh_pkey='C:\\key.pem,
remote_bind_address=(
'192.168.2.0',
5432
),
local_bind_address=(
'0.0.0.0',
400
))
sshトンネル開始
設定後はsshトンネルを有効化します。有効化後は設定で与えたロカールポートにアクセスすると踏み台にバインドしたDBにアクセスすることができます。
例でいうとローカルの5432ポートに対してSQLを実行すると192.168.2.0のDBに対してSQLが実行されます。
server.start()
sshトンネル終了
全ての処理が終わったら、sshトンネルを閉じてあげる必要があります。
server.stop()
おわりに
pythonでsshトンネル操作する方法をまとめました。
上のことを活用して踏み台の先のDBから情報を取得してエクセルに記載するプログラムを作りました。
このように前回のエクセル操作とさらに前のDB操作を使えば出来ることが広がります。。
踏み台にログインして色々するのではなく、自身が快適になるように作成したローカルの環境を最大限利用してテストや本番環境などの作業を最高効率で作業して極力楽しましょう。