クラウドサーバーのデータベースにアクセスする際、セキュリティを確保するためにSSH(Secure Shell)ポート転送を使用することが一般的です。この記事では、VBA(Visual Basic for Applications)を使用してSSHポート転送を設定し、クラウドサーバーのデータベースにアクセスする方法を説明します。
クラウドサーバーには、レンタルサーバー(XSERVERなど)なども含みます。
必要なツールとライブラリ
まず、SSHポート転送とデータベース接続のために必要なツールとライブラリを紹介します。
- PuTTY(特に
plink
ツール) - ADODBライブラリ(VBAでデータベースに接続するため)
PuTTYはSSH接続のためのフリーソフトウェアで、特にplink
はコマンドラインからSSH接続を確立するためのツールです。ADODBライブラリは、VBAを使用してデータベース接続を行うための標準ライブラリです。
手順
以下の手順で、VBAからSSHポート転送を使用してクラウドサーバーのデータベースにアクセスします。
1. PuTTYのインストール
まず、PuTTYをインストールし、plink.exe
のパスを確認します。PuTTYの公式サイトからダウンロードできます。
2. SSHトンネルの設定
plink
コマンドを使用してSSHトンネルを作成します。以下のVBAコードは、プライベートキーを使用してSSHトンネルを確立し、そのトンネルを通じてローカルホストのポートをリモートのデータベースサーバーに転送します。
Sub SSHPortForwardingAndDBAccess()
Dim plinkPath As String
Dim privateKeyPath As String
Dim sshUser As String
Dim sshHost As String
Dim localPort As String
Dim remoteHost As String
Dim remotePort As String
Dim plinkCommand As String
' PuTTY plinkのパス
plinkPath = "C:\path\to\plink.exe"
' SSH接続情報
privateKeyPath = "C:\path\to\private_key.ppk"
sshUser = "your_ssh_username"
sshHost = "your_ssh_host"
' ポート転送設定
localPort = "3307" ' ローカルポート
remoteHost = "127.0.0.1" ' リモートホスト(データベースサーバー)
remotePort = "3306" ' リモートポート(データベースサーバー)
' plinkコマンドの生成
plinkCommand = plinkPath & " -i " & privateKeyPath & " -L " & localPort & ":" & remoteHost & ":" & remotePort & " " & sshUser & "@" & sshHost
' SSHトンネルを確立
Shell plinkCommand, vbMinimizedFocus
' 一時的な待機時間を設定(SSHトンネルが確立されるまで)
Application.Wait (Now + TimeValue("0:00:05"))
' データベース接続と操作
Dim conn As Object
Dim rs As Object
Dim sql As String
' データベース接続の設定
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Driver={MySQL ODBC 8.0 Driver};Server=127.0.0.1;Port=" & localPort & ";Database=your_database_name;User=your_db_username;Password=your_db_password;Option=3;"
' SQLクエリの実行
sql = "SELECT * FROM your_table_name"
rs.Open sql, conn
' データの処理
Do While Not rs.EOF
Debug.Print rs.Fields("your_field_name").Value
rs.MoveNext
Loop
' リソースの解放
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
コードの詳細な解説
- PuTTYのパスとSSH接続情報の設定
plinkPath
にはplink.exe
のパスを指定します。privateKeyPath
にはSSHのプライベートキーのパスを指定します。sshUser
とsshHost
にはSSHのユーザー名とホストを設定します。
- ポート転送設定
localPort
にはローカルで使用するポート番号を指定します。remoteHost
にはリモートのデータベースサーバーのホスト名(通常は127.0.0.1
)を設定します。remotePort
にはリモートのデータベースサーバーのポート番号を指定します。
- SSHトンネルの確立
plinkCommand
変数にplink
コマンドを構築し、Shell
関数で実行します。これにより、ローカルポートとリモートポートがトンネルで接続されます。- トンネルが確立されるまでの待機時間を設定します(5秒)。
- データベース接続と操作
ADODB.Connection
を使用して、ローカルホストの指定ポートを介してデータベースに接続します。- SQLクエリを実行し、結果を処理します。
- リソースの解放
- データベース接続とレコードセットをクローズし、リソースを解放します。
注意点
plink
のパスとプライベートキーのパスを適切に設定してください。- データベース接続情報を正確に入力してください。
- SSHトンネルが確立されるまでの待機時間を環境に応じて調整してください。
応用・実践例
VBAを使用したSSHポート転送を応用した高度なテクニックや応用例について説明します。これにより、クラウドサーバーのデータベースに安全かつ効率的にアクセスする方法をさらに広げることができます。
複数のデータベースへの同時接続
企業のデータ処理や分析業務において、複数のデータベースに同時に接続し、データを集約する必要がある場合があります。SSHポート転送を利用して複数のリモートデータベースに接続する方法を紹介します。
Sub ConnectMultipleDatabases()
Dim plinkPath As String
Dim privateKeyPath As String
Dim sshUser As String
Dim sshHost As String
Dim localPort1 As String, localPort2 As String
Dim remoteHost As String
Dim remotePort1 As String, remotePort2 As String
Dim plinkCommand1 As String, plinkCommand2 As String
' PuTTY plinkのパス
plinkPath = "C:\path\to\plink.exe"
' SSH接続情報
privateKeyPath = "C:\path\to\private_key.ppk"
sshUser = "your_ssh_username"
sshHost = "your_ssh_host"
' ポート転送設定
localPort1 = "3307" ' ローカルポート1
remoteHost = "127.0.0.1" ' リモートホスト(データベースサーバー)
remotePort1 = "3306" ' リモートポート1(データベースサーバー1)
localPort2 = "3308" ' ローカルポート2
remotePort2 = "3307" ' リモートポート2(データベースサーバー2)
' plinkコマンドの生成
plinkCommand1 = plinkPath & " -i " & privateKeyPath & " -L " & localPort1 & ":" & remoteHost & ":" & remotePort1 & " " & sshUser & "@" & sshHost
plinkCommand2 = plinkPath & " -i " & privateKeyPath & " -L " & localPort2 & ":" & remoteHost & ":" & remotePort2 & " " & sshUser & "@" & sshHost
' SSHトンネルを確立
Shell plinkCommand1, vbMinimizedFocus
Shell plinkCommand2, vbMinimizedFocus
' 一時的な待機時間を設定(SSHトンネルが確立されるまで)
Application.Wait (Now + TimeValue("0:00:05"))
' データベース接続と操作
Dim conn1 As Object, conn2 As Object
Dim rs1 As Object, rs2 As Object
Dim sql1 As String, sql2 As String
' データベース接続の設定
Set conn1 = CreateObject("ADODB.Connection")
Set conn2 = CreateObject("ADODB.Connection")
conn1.Open "Driver={MySQL ODBC 8.0 Driver};Server=127.0.0.1;Port=" & localPort1 & ";Database=database1;User=db_user;Password=db_password;Option=3;"
conn2.Open "Driver={MySQL ODBC 8.0 Driver};Server=127.0.0.1;Port=" & localPort2 & ";Database=database2;User=db_user;Password=db_password;Option=3;"
' SQLクエリの実行
sql1 = "SELECT * FROM table1"
sql2 = "SELECT * FROM table2"
Set rs1 = CreateObject("ADODB.Recordset")
Set rs2 = CreateObject("ADODB.Recordset")
rs1.Open sql1, conn1
rs2.Open sql2, conn2
' データの処理
Do While Not rs1.EOF
Debug.Print rs1.Fields("field_name").Value
rs1.MoveNext
Loop
Do While Not rs2.EOF
Debug.Print rs2.Fields("field_name").Value
rs2.MoveNext
Loop
' リソースの解放
rs1.Close
rs2.Close
conn1.Close
conn2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set conn1 = Nothing
Set conn2 = Nothing
End Sub
説明
上記のコードでは、plink
を2回使用して2つのSSHトンネルを確立し、それぞれのトンネルを介して異なるデータベースに接続しています。これにより、複数のデータベースからデータを同時に取得できます。
スケジュールされた自動データ収集
特定の時間に自動でデータを収集し、定期的に更新するためのスケジュールされたタスクを作成することができます。以下のコードは、Windowsタスクスケジューラを使用して、毎日指定した時刻にデータベースからデータを取得するVBAマクロを実行する例です。
手順
- VBAマクロの作成
以下のVBAコードを新しいモジュールに追加します。
Sub ScheduledDataCollection()
' SSHトンネルとデータベース接続のコード(前述のコードを再利用)
Call SSHPortForwardingAndDBAccess
End Sub
- バッチファイルの作成
次に、VBAマクロを実行するためのバッチファイルを作成します。例えば、以下の内容をRunMacro.bat
として保存します。
cd "C:\path\to\your\excel\file"
start excel.exe /r "YourExcelFile.xlsm" /e "ScheduledDataCollection"
このバッチファイルは、指定したExcelファイルを開き、ScheduledDataCollection
というマクロを実行します。
- タスクスケジューラの設定
Windowsのタスクスケジューラを開き、新しいタスクを作成します。以下の設定を行います。
- トリガー: 毎日指定した時刻に設定
- 操作: バッチファイルを実行するように設定
データの自動バックアップ
データベースのデータを定期的にローカルファイルにバックアップするための方法です。
Sub DatabaseBackup()
Dim plinkPath As String
Dim privateKeyPath As String
Dim sshUser As String
Dim sshHost As String
Dim localPort As String
Dim remoteHost As String
Dim remotePort As String
Dim plinkCommand As String
' PuTTY plinkのパス
plinkPath = "C:\path\to\plink.exe"
' SSH接続情報
privateKeyPath = "C:\path\to\private_key.ppk"
sshUser = "your_ssh_username"
sshHost = "your_ssh_host"
' ポート転送設定
localPort = "3307" ' ローカルポート
remoteHost = "127.0.0.1" ' リモートホスト(データベースサーバー)
remotePort = "3306" ' リモートポート(データベースサーバー)
' plinkコマンドの生成
plinkCommand = plinkPath & " -i " & privateKeyPath & " -L " & localPort & ":" & remoteHost & ":" & remotePort & " " & sshUser & "@" & sshHost
' SSHトンネルを確立
Shell plinkCommand, vbMinimizedFocus
' 一時的な待機時間を設定(SSHトンネルが確立されるまで)
Application.Wait (Now + TimeValue("0:00:05"))
' データベース接続と操作
Dim conn As Object
Dim rs As Object
Dim sql As String
Dim fso As Object
Dim textFile As Object
' データベース接続の設定
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Driver={MySQL ODBC 8.0 Driver};Server=127.0.0.1;Port=" & localPort & ";Database=your_database_name;User=your_db_username;Password=your_db_password;Option=3;"
' SQLクエリの実行
sql = "SELECT * FROM your_table_name"
rs.Open sql, conn
' ファイルシステムオブジェクトの作成
Set fso = CreateObject("Scripting.FileSystemObject")
Set textFile = fso.CreateTextFile("C:\path\to\backup.txt", True)
' データの処理と書き込み
Do While Not rs.EOF
textFile.WriteLine rs.Fields("your_field_name").Value
rs.MoveNext
Loop
' リソースの解放
textFile.Close
rs.Close
conn.Close
Set textFile = Nothing
Set rs = Nothing
Set conn = Nothing
End Sub
説明
このコードは、指定したデータベースからデータを取得し、テキストファイルに書き込むことでバックアップを作成します。ファイルパスやフィールド名は適宜調整してください。
ここで紹介させていただいた応用例では、VBAを使用したSSHポート転送を利用して、複数のデータベースへの同時接続、スケジュールされた自動データ収集、データの自動バックアップの方法を紹介しました。これらのテクニックを組み合わせることで、より効率的でセキュアなデータ処理を実現できます。業務の要件に応じてこれらの技術を活用し、データ管理の精度と効率を向上させましょう。
まとめ
一昔前までは、自社にサーバーを置き、データーベースもローカルで運用することが当たり前でしたが、現在では、クラウドにデーターベースを設置することが一般的になっています。
VBAを使用してSSHポート転送を介してクラウドサーバーのデータベースにアクセスする方法を説明しました。PuTTYのplink
ツールを使用してSSHトンネルを確立し、ADODBライブラリを使用してデータベースに接続する手順を示しました。これにより、セキュリティを確保しながらリモートのデータベースにアクセスできます。セキュアなデータベースアクセスを実現するために、ぜひこの方法を試してみてください。