DEVGRU

プログラミングと競馬予想について書きます

Google Cloud Platform Compute Engine の VM インスタンスにSSHでつなぐ

BigQuery を使っている縁(?)から、計算用のインスタンスもGoogle Cloud Platform (GCP) を使っている。

具体的には、 AI Platform の Notebook インスタンスを立てているのだが、これは結局 Compute Engine の VM インスタンスに Jupyter Lab をプリインストールしただけのものだったりするので、 SSHログインは可能(ただし、Jupyter Labのユーザではログインできず、別ユーザとなる)

IPアドレスはエフェメラル(起動ごとに変わる)がデフォルトで、staticにすることで固定もできるが、まあまあお金がかかる。 しかし gcloud コマンドでVMインスタンスのIPアドレスを調べられるので、 ssh config と組み合わせれば接続が可能なので、その方法を紹介する。

事前に gcloud コマンドのセットアップとAPIの許可は済ませておいてほしい( ここ を参照)。

まず、ダッシュボードからプロジェクトIDを取得する。 英単語-英単語-数値 のフォーマットとなる。

次に、サイドバーから Compute Engine → VMインスタンスを開き、インスタンスの一覧から SSH 対象のインスタンスの名前とゾーンを調べて控えておく。 インスタンスの名前は作成時につけた任意の英数、ゾーンはリージョン+ハイフン、アルファベットの形式(Ex. asia-northeast1-a)となる。

ローカルでターミナルを開き、以下のコマンドで .ssh/config に設定を書き込む(適宜書き換えてください)。

ssh インスタンスの名前.ゾーン.プロジェクトID

すると、 .ssh/config に設定が書き込まれる。

Host インスタンスの名前.ゾーン.プロジェクトID
    HostName 実際のIP
    IdentityFile /Users/myname/.ssh/google_compute_engine
    UserKnownHostsFile=/Users/myname/.ssh/google_compute_known_hosts
    HostKeyAlias=compute.~~~
    IdentitiesOnly=yes
    CheckHostIP=no

このままでも使えそうだが、 HostName のIPはインスタンス再起動ごとに変わるのと、Hostが使いにくいので、書き換える必要がある。

Host は任意の文字列を入れられるので、 my-instance としておく。 HostName の代わりに、ProxyCommand で動的にIPを調べるコマンドを入れる。

Host my-instance
    ProxyCommand /usr/bin/nc $(gcloud compute instances describe インスタンスの名前 --zone ゾーン --format='get(networkInterfaces[0].accessConfigs[0].natIP)') %p
    IdentityFile /Users/myname/.ssh/google_compute_engine
    UserKnownHostsFile=/Users/myname/.ssh/google_compute_known_hosts
    HostKeyAlias=compute.~~~
    IdentitiesOnly=yes
    CheckHostIP=no

nc コマンドのパスは macOS の場合だが、 Linux の場合は異なるパスにある可能性があるので、 which nc などして調べる(またはインストールしておく)。

最後に、以下のコマンドでログインできることを確認する。

ssh アカウント名@my-instance

GCPの教科書

GCPの教科書