2022/06/10

Notebookで分析とVS Codeで開発をリモートで同時に行う話

 GCP の Vertex AI Workbench はクラウドでデータ分析をする環境として非常に便利です。AI関連の分析はもちろん、単なる jupyter notebook として、python や R で notebook ベースでの分析作業環境を簡単に構築できます。

一方、分析は分析だけで終わる場合もありますが、その結果を使って、また、分析自体をパッケージ化して、なんらかのツールを開発することがしばしばあります。もしくは、notebook で使うモジュールを分析と同時に開発するというケースもあります。ところが、分析と開発を同時にやりたいと思ったとき、jupyter notebook だけでは開発環境がちょっと弱い。

そのようなニーズに対応するためかどうかはわかりませんが、Vertex AI Workbench には jupyter notebook ではなく、Theia IDE を UI として使うメニューも(現状は Experimental ですが)あります。しかし・・・Theia より、VS Code を使いたい・・・。見た目はほぼ同じなので、Theia に慣れればいいだけなのですが、なんとも言われぬもっさり感に、いや、VS Code の快活な動きに慣れてしまった後では、どうしても Theia よりは VS Code で、と思ってしまいます。


ならば、クラウドのノートブックインスタンスに、VS Code の remote SSH で繋げばいいじゃないか!と思ってやってみたらあっさり繋がりましたので、その備忘メモです。


まず、Vertex AI Workbench のノートブックインスタンスは適当に作って立ち上げておきます。


ローカル側ではVS Code を用意し、また、ssh でノートブックインスタンスに接続するので、SSH の設定が一通り必要になります。

まず、SSHの鍵ペアを用意します。無ければ生成して、しかるべき場所に置きます。ローカルが Windows ですと、VS Code は(たぶん)Power Shell の SSH を使って接続しようとするので、C:/user/(name)/.ssh に置くことになると思います。

で、作成した公開鍵を上で立ち上げたノートブックインスタンスに登録します。登録は、Vertex AI Workbench のコンソールからではなく、Compute Engine の設定画面から行います。コンソールのVMインスタンスから当該のインスタンスの設定を「編集」、SSH認証鍵のところで「項目を追加」から公開鍵を記入します。

このとき、公開鍵の最後にくっついているコメントがそのままユーザー名になるので、必要ならばこれを jupyter にしておきます。これは、プロジェクトベースでノートブックインスタンスを立ち上げると、利用するユーザーは Google Account の個人ではなく、Jupyter Notebook のサービスアカウントになっているからです。その名前が jupyter さんなので、ここで登録する SSH公開鍵の名前も jupyter さんにしておきます。

なお、プロジェクトによってはセキュリティの都合上 Compute Engine のインスタンスへの直接 SSH アクセスを禁止していることがありますが、その場合は諦めましょう。管理者が設定したセキュリティ要件には従ってください。


さて、SSH公開鍵をノートブックインスタンスに設置したら、ローカルから SSH 接続ができるかどうかを試します。ローカルの SSHクライアントを適切に選び、接続テストをします。

接続ができたら、config ファイルを作成します。VS Code はその config の Host を見て接続するので、ここに必要な事項を書いておきます。例えば、

Host mynotebookinstance

HostName xxx.xxx.xxx.xxx

User jupyter

IdentityFile ~/.ssh/id_rsa

など。

ここで注意なのが、HostName です。ここにIPアドレスを記入するのですが、Vertex AI Workbench で立ち上げたインスタンスの外部IPはエフェメラルなので、変化する可能性があります。固定IPを契約する、もしくは何らかのホスト名をつけるというのがよいのですが、それができない場合は毎回 IP アドレスを確認し、この HostName を修正する必要があります。但し、セキュリティ的にはそういう運用はあまりよくなさそうですので、心配な方は IT 部門に相談しましょう。


ここまできたら、あとは VS Code の remote-ssh で接続するだけです。VS Code の remote-ssh 拡張は、WSL で VS Code を使っていればおなじみのプラグインなので、入っていればそれでOK。無ければインストールします。

その後、左下の「リモートウィンドウを開きます」から Connect to Host を選ぶと、先ほど config に設定した Host が出てくるので、それを選択します。SSH鍵のパスフレーズを入力し、最初はリモートインスタンスのタイプを尋ねられるので、Linux を選択したら、VS Code からノートブックインスタンスに繋がるはず。左ペインにリモートのディレクトリが見えればOKです。


リモート開発環境の設定、例えば launch.json や settings.json などを適宜実施すれば、めでたく、jupyter notebook をブラウザで開きつつ、VS Code でリモート開発ができる環境が作れました。



最後にセキュリティについて。

そもそも、なぜわざわざクラウドでこういうことをやりたいのかというと、一番の理由は「ローカルに分析の痕跡を残したくない」からです。データ分析の仕事は秘密のデータをたくさん扱うので、データのセキュリティのことを考えると、最も安全なのは、「データをクラウドから出さない」ことです。GCP にはプロジェクトという枠組みがあって、プロジェクトの中にあるものは、プロジェクトの外からは見えなくなっています。Google Account を使ってプロジェクトの中に入ることで、初めてデータやコードなどのリソースに触ることができ、プロジェクトから出ればそれらとしっかり遮断される、そういう環境が理想的です。

そして、Vertex AI Workbench のサービスが開始されて以降、ようやくその理想に近づいてきました。(その以前から別の名前で同様のサービスがあったのですが、最初は非常に使いにくかった。)また一歩、「クラウドから出さないデータ分析」の理想に近づきました。

ただ、それでもまだ完璧ではないのは、Theia のもっさり感と、代替手段である VS Code の快活さです。正直、Vertex AI の Theia での開発はまだちょっと無理です。非常に重い。Theia 自体もさることながら、ブラウザベースでのコミュニケーションであること、また、おそらくコンソールの通信をツールがうまく橋渡ししておらず、タイピングのレイテンシがかなりのストレスになります。

そこで、理想は理想としてありつつも、現実的な路線として、VS Code によるリモート開発が選択肢として上がってきます。SSHで繋ぐので、リモート環境にあるコードやデータをローカルにダウンロードしようと思えば可能です。しかしそのためには scp などを意図的に使う必要がある、つまり、無意識にデータが漏洩することはありません。それ以外では、普通にVS Code でリモート開発しているだけなら、ローカルには(キャッシュを除き)痕跡は残りません。リモートを切断すればローカルには何もありません。

唯一の懸念点は、ローカルに置いてある SSH鍵を使えば、ノートブックインスタンスにアクセスできてしまう点です。この鍵は Google Account を経由せずにプロジェクトの中に入れるので、注意が必要です。しかしその一方で、あくまでも GCP のサービスアカウントの一つですから、その権限を正しく設定しておくことで、リスクを低減することが可能です。また、ノートブックインスタンスは IPアドレスが常に変化するので、万が一この設定が盗難されてしまったとしても、Google Account 無しに IPアドレスを突き止めることは不可能です。さらには、SSH鍵に正しくパスフレーズを設定しておくことで、リスクは限りなくゼロに近づけることができます。

ということで、これらのセキュリティ要件をちゃんと考えた上で、VS Code でのリモート開発は便利で効率的、という話でした。

0 件のコメント: