![R を使用して SSH トンネル経由でサーバー上の PostgreSQL データベースに接続するにはどうすればよいですか?](https://rvso.com/image/1648576/R%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20SSH%20%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%E7%B5%8C%E7%94%B1%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%B8%8A%E3%81%AE%20PostgreSQL%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
SSH トンネルを介して、サーバー (Digital Ocean) 上の PostgreSQL データベースに RStudio セッションを接続しようとしています。SSH 接続、特に R の使用は初めてです。
システム情報:
ローカル コンピューターでは、Windows 10 x64 を使用しています。PostgreSQL 13、R 4.0.3、OpenSSH サーバー、OpenSSH クライアントをインストールしました (Open SSH については、標準の Windows バージョンを使用しています)。
Digital Ocean ServerにはUbuntu 20.04.1、postgresql 12+214ubuntu0.1、openssh-server 1:8.2p1-4ubuntu0.2がインストールされている。
一般的なコンテキスト:
まず、すでに .PEM キー ペア (秘密キーのパスフレーズを「passp」と呼びます) の秘密キーを生成し、Digital Ocean Server (以降、DO Server) で公開キーを有効にしています。また、DO Server は SSH 接続を許可するようにすでに構成されています (例: IP: 123.456.789.01、ポート: 1234)。
上記の構成により、PgAdmin を DO サーバーの Postgresql データベースに接続できました。次のパラメータを使用してデータベースにログインしました。
- db名 = "db"
- doserver_user = "root"
- db_user = "ユーザー名"
- パスワード = "pwd"
CMD アプリケーションを使用して、PC から DO サーバーに接続することができました。使用しているコマンドは次のとおりです。
ssh -i "C:/path/to/ssh/key" -L 5555:127.0.0.1:1234 [email protected]
この接続が開いているときは、もちろん DO サーバーにアクセスできます。ローカル ポート 5555 が実行中であることを確認するために、コマンドを実行しnetstat -ao | find "5555"
、次の結果を受け取りました。
TCP 127.0.0.1:5555 hp-PC:0 LISTENING 14132
R に移行する前に、sshd_config ファイルを再度チェックして、TCPForwarding が許可されていること、および ListenAdress がローカルホスト (127.0.0.1) に対して設定されていることを確認しました。このチェックは、自分の PC と DO サーバーで実行しました。
これらすべてが完了したら、RStudio に移動し、次のコードを使用して DO サーバー上の Postgresql データベースに接続しようとしました。
library(DBI) #DBI version 1.1.1
library(RPostgres) #RPostgres version 1.3.2.9000
con <- DBI::dbConnect(drv = RPostgres::Postgres(),
dbname= "db",
host = "127.0.0.1",
port = "5555",
user= "root",
password= "pwd")
私が理解している限りでは、ホスト「127.0.0.1」とポート「5555」を使用しているのは、それがリッスンしているポートであり、すでに DO サーバー IP (123.456.789.01) に転送されているためです。
試みと失敗:
エラー 1
R のコードにさまざまなオプションを試してみたところ、いくつかのエラーが発生しました。上記の初期コードでは、次のエラーが発生します。
Error: SSL error: wrong version number
expected authentication request from server, but received S
ホストを「localhost」に変更したり、ユーザーを「username」(DO サーバーではなく、データベースにアクセスするユーザー)に変更した場合も、同じエラーが発生します。
エラー 2
R コードで別のポートを呼び出して (たとえば、ポートを「5433」に変更して)、何かが起こるかどうかを確認しようとしましたが、エラーが発生しました:
could not connect to server: Connection refused (0x0000274D/10061)
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?
このエラーは、CMD アプリケーションからの接続を閉じた場合、またはホストの値を別の IP (たとえば、ホスト = 111.222.333.44) に変更した場合にも発生します。
エラー 3
苦肉の策として、RStudio から直接接続を作成してみました。これを行うには、次のものを使用しました。
library(ssh) #ssh version 0.7.0
session <- ssh::ssh_connect(host= "[email protected]:22", keyfile = "C:/path/to/ssh/key")
ssh::ssh_tunnel(session, port = local_port, target = serv_host)
そして、次のような結果が得られました。
/ Waiting for connection on port 5555...
R はシングル スレッドなので、同じセッション (セッション A) から DBI::dbConnect を実行できませんでした。そこで、新しいセッション (セッション B) を開始し、上記のように DBI::dbConnect を実行しました。結果は次のとおりです。
#Session A
- Waiting for connetion on port 1090... client connected!
Error: libssh failure at 'channel_open_forward': Socket error: No error
#Session B
#No result, just got stuck processing
質問
私は、自分の PC の RStudio を DO Server の Postgresql データベースに接続できるようにしたいだけです。設定やコードの間違いを指摘してこれを実現しても、まったく別の方法があっても、まったくかまいません。
皆様からいただいたあらゆるご提案に大変感謝いたします。
答え1
どうやらこれには簡単な解決策があり、ダニエル・ヴェリテ。
Postgresqlがサーバーをリッスンするデフォルトのポートであるポート「5432」を呼び出すことが重要です。(この場合は Digital Ocean)。したがって、CMD アプリケーションの最終的なコードは次のようになります。
ssh "C:/path/to/sshkey" -L 5555:127.0.0.1:5432 [email protected]
どこ:
- 5555 はローカル コンピュータのポートです (ユーザーが 1,024 から 32,767 までの任意の番号に割り当てることができます)SSH および Telnet 接続のポート番号
- 127.0.0.1はローカルホストを示します
- 5432は、前述のように、PostgreSQLが着信接続をリッスンするデフォルトのポートです。
- 123.456.789.01はサーバIPに対応するIPの例です
- 追加の注意として、sshキーでパスフレーズを設定した場合、CMDアプリケーションでこのコード行を実行した直後にパスフレーズが要求されます。
それを実行すると、上記のコードを使用して R が問題なく接続されました。
答え2
psql は、PostgreSQL が提供する対話型ターミナル プログラムです。psql ツールを使用すると、SQL ステートメントの実行、データベース オブジェクトの管理など、さまざまな操作を実行できます。
これを確認できます:
ssh -i "C:/path/to/ssh/key" -L 5555:127.0.0.1:1234 [email protected]
SSHポートの詳細については、ここ