VSCodeでリモートデバッグをするための手順をご紹介します。目標はリモート側の Linux 上で動く Python のリモートデバッグですが、この記事ではまず SSH ベースでセッションを張るところまでを目指します。手元の環境は以下の通りです。
クライアント:Windows10 + VSCode 1.44.0 + OpenSSH_for_Windows
ターゲット(サーバ):CentOS7 + Python 3.x
筆者は SSH クライアントとして PuTTY を常用していますが、後述の Remote-SSH Extension が現時点では PuTTY に対応していないため、ここでは別の実装(Windows10 標準の SSH)を使っています。
SSH の接続設定
SSH の設定は %USERPROFILE%/.ssh/config で行います。ここで IP アドレスを明示しておくと、SSH に関しては hosts への追加等は不要なようです。設定例を以下に示します。
cat .ssh/config
Host zabbix
Hostname 192.168.56.37
User vagrant
IdentityFile ~/.ssh/id_rsa_for_zabbix
以下のパラメータは、ご自分の環境のものに読み替えてください。
接続先ホスト名 | zabbix |
接続ユーザ名 | vagrant |
接続に使用する秘密鍵ファイル名 | id_rsa_for_zabbix |
公開鍵ファイル名 | id_rsa_for_zabbix.pub |
サーバ側では、接続ユーザのホームディレクトリ配下の ~/.ssh/authorized_keys に公開鍵を追加しておきます。
$ cp /path/to/id_rsa_for_zabbix.pub ~/.ssh # 外部から公開鍵を持ち込む場合
$ cat ~/.ssh/id_rsa_for_zabbix.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/*
SSH 単体での接続確認を行います。VSCodeを開き、[ターミナル]>[新しいターミナル]でPowerShellのコンソールを開き、以下のように接続できればOKです。
PS C:\Users\hotta> ssh -V
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
PS C:\Users\hotta> ssh zabbix
Last login: Thu Apr 9 13:39:42 2020 from 192.168.56.1
vagrant@zabbix:~$ exit # 接続できたのでいったん抜ける
PS C:\Users\hotta>
エクステンションのインストール
次に、VSCode のサイドバーの Extension ボタンをクリックし、Remote Development を検索してインストールします。
Remote Development extention は以下のエクステンションのセットになっています。この記事では、この中の Remote – SSH 機能を使います。
- Remote – SSH
- Remote – Container
- Remote – WSL
Remote Development extention をインストールすると、画面左下隅のボタンからリモートホストへの接続ができるようになります。
ターゲットへの接続
接続ボタンをクリックすると、利用可能な操作一覧が表示されるので、Remote-SSH: Connect to Host..を選択します。
.ssh/config に記載された接続先一覧が表示されるので、接続したいホストを選びます。
接続後、新しい VSCode のインスタンス(ウィンドウ)が開きます。その後ターゲットホストの OS カテゴリーを選択するポップアップが出てきますので、『可及的速やかに(理由は後述)』Linux を選択します。
「起動時にウェルカムページを表示」にチェックを入れている方は、ここで「ようこそ画面」になります。この場合、エクスプローラボタンをクリックし、さらに[ターミナル]>[新しいターミナル]でターミナルを開いておいてください。
接続後の画面
リモート側でリモート管理用サーバ(node.js で書かれた vscode-server)のデプロイと起動が終わったら、画面が以下のようになります。まずはターミナルの画面です。
シェルが PowerShell から Bash に変わっています。警告が2つ出ていますが、上の方はプラットフォームの選択なので “Don’t Show Again” でよいでしょう。後者は Git が古いと文句を言っていますが、CentOS7 の標準では Git 1.8.x のようです。こちらもとりあえず見なかったことにします。
つぎにエクスプローラの状態です。リモート側の既存のフォルダを開くか、または外部リポジトリをクローンするかを選択できます。
これでローカル側に開発用ソースツリーを置いておくことなく、リモートデバッグの準備ができました。続きは VSCodeでリモートデバッグ(Python編)を参照してください。
トラブルシュート(1)
ターゲットホストの OS カテゴリーを選択するポップアップが出てきたところで、記事を書くためにスクショを取っていたら、画面が以下のように変わりました。
エラーの最終行に Resolve error が出ています。名前解決ができていないようです。名前解決といえばまず思い浮かぶのはホスト名なので、ping で確認します。
PS C:\Users\hotta> ping zabbix
ping 要求ではホスト zabbix が見つかりませんでした。ホスト名を確認してもう一度実行してください。
.ssh/config の中で Hostname で IP を書いていても、ping が参照してくれないのは当たり前です。hosts ファイルにエントリを追加し、再度確認します。
PS C:\Users\hotta> grep zabbix c:/windows/system32/drivers/etc/hosts
192.168.56.37 zabbix
PS C:\Users\hotta> ping zabbix
zabbix [192.168.56.37]に ping を送信しています 32 バイトのデータ:
192.168.56.37 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.37 からの応答: バイト数 =32 時間 <1ms TTL=64
この状態でやってみましたが、やっぱり同じエラーになります。次は、エラーの末尾から2行目の “getPlatformForHost was canceled” に着目してググりました。いくつか質問サイトは出てくるものの、「再現条件が書かれていないからクローズするよ」という無慈悲なコメントとともに放置されています。
その中で、中国語のページにヒントがありました。自分で remote.SSH.remotePlatform を設定すればいいんじゃね?、のように読めました(読めないけど)。OS の選択を手動設定してみたらどうかとアドバイスしているのかなと思い、ダメ元でもう一度接続してみて、選択メニューが表示されている間にサクッと Linux を選択したら、ようやくうまくいきました。結果的に hosts ファイルへのエントリの追加は不要でした。
ここ、選択のタイマー値が短いのと、せめて “OS type selection timed out” くらい出してくれてもいいのになぁと思いました。
トラブルシュート(2)
接続しようとしたら、以下のようなメッセージが出ることがありました。
また Resolve error ですが、よく見ると最初のところにちゃんと “Host key verification failed.” って書いてありますね。
今回は、vagrant destroy && vagrant up した後に発生したもので、VM を作り直したことに伴いホスト鍵が変わってしまったためです。この場合の対処としては .ssh/known_hosts の該当行を削除して、再度 ssh コマンドで接続し直してやればよいです。
この他の原因としては、接続先のホストが( DNS や hosts 変更により)変わってしまったことも考えられます。