Google の Cloud Platform サービスの中の最小インスタンスであるf1-microが無料化されるというニュースがありました。早速使ってみたところJupyterを外部から使用することに成功しました。f1-microは非常に小さなインスタンスですが、重い作業をさせなければ十分に使うことが出来ます。
以下、設定の仕方などを説明します。なお、これが一番いい方法かどうかは、わかりかねます。
インスタンスの設定
GCP (Goolge Could Platform )の契約にはクレジット・カードが必要です。契約が済めば、普段使いのgmailと同じアカウントでGCPを使うことが出来ます。インスタンス(コンピュータ実体)の操作は全てブラウザ上に表示されるダッシュボードから行います。
まず、事前に用意されているイメージからインスタンスを作ります。Cloud Platfomのダッシュボードから検索機能を使ってCompute Engineのパネルを開いてください。左のメニューから「イメージ」をクリックすると使用できるイメージが現れます。ubuntu-1604-xenialを選択して、上のバーから「インスタンスを作成」をクリックしてください。
インスタンスの作成に入ります。名前は適当に決めてください。ゾーンですが、今のところ「US Regionであれば」無料だと言うことなので、米国にあるサーバーを選びます。私の場合、無料になっていないのですが向こう1年くらいは何にせよ無料なので気にしていません。気になる人はよく調べてから先に進んでください。
課金されても知りませんのであしからず。
マシンタイプはmicroを選んでください。主記憶600MBですが、デスクトップを描画するわけではありませんので十分です。ブートディスクとサービスアカウントは変更しません。
ファイアーウォールはHTTPSにチェックを入れておいてください。なお、ここでチェックを忘れても後からチェックできます。その後、「作成」ボタンでインスタンスを作成します。
インスタンスができました。2番目のものが今回作成したインスタンスです。すでに動作状態ですので早速使ってみましょう。右側のドロップダウン・メニューから「ブラウザウィンドウで開く」を選んで実行します。
すると、ブラウザのウィンドウが新しく開き、コンソールが表示されます。このウィンドウはSSHで保護されており、安全です。クライアント側に特別なソフトは要りません。気抜けするほど簡単です。
コマンドプロントはubuntuですのでbashです。
Jupyterをインスタンスにインストール
JupyterのインストールはAnacondaを使うと簡単です。AnacondaはContinuum Analyticsが開発したデータ解析用のパッケージで、Pythonで動作する数値計算、数式処理、信号処理、グラフ描画などをはじめとする非常に多くのパッケージが用意されています。Jupyterもそのひとつです。Anacondaをインストールすればこれらは全部動くのでお任せでいいでしょう。
GCPのf1-microインスタンスにはデスクトップがないため、ブラウザを開くことができません。そこでクライアント(今使用しているパーソナル・コンピュータ)のブラウザを使ってAnacondaのダウンロードページへ進み、Linux用Python 3.xの64bit版インストーラー(下の図の右上、濃い緑のボタン)のダウンロード・リンクをコピーします。
GCPのSSHウィンドウにはテキストをペーストできます。そこで先ほどのリンクを貼り付けてwgetコマンドでダウンロードを行います。
wget https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh
クラウド・サービスはネットワーク回線が太いため、ダウンロードはあっという間です。ダウンロードが終わったら、インストーラ(sherllスクリプト)を実行してインストールします。
bash Anaconda3-4.3.1-Linux-x86_64.sh
途中、質問に答えて先に進むとインストールが始まります。これには時間が掛かるため、コーヒーでも飲みながら待ちましょう。インストールの最後に「Anacondaへのパスを.bashrcに書き込むか」と聞いてきますので、yesと答えます。ここでSSHウィンドウを閉じ、ダッシュボードからSSHウィンドウを開きましょう。これでAnacondaは利用可能になっています。
Jupyterの設定
次にJupyterの設定を行います。
インストール直後はコンフィギュレーションファイルが作られていませんので、まずはそれを作りましょう。概ね、Jupyter teamの公式文書であるRunning a notebook serverに書いてあるとおりの設定です。
cd ~ jupyter notebook --generate-config cd .jupyter
次に以下のコマンドを実行してSSL用の鍵を作ります。
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
鍵は実行ディレクトリに作られますので、あらかじめ ~/.jupyterに移動しておきましょう。なお、こうして作られた鍵は暗号化機能こそあるものの、署名が公式のものではありません。そのため、後で説明するようにブラウザがエラーを表示します。個人で使う分には問題ありませんが、業務には正式の手順を踏んで出所を証明できる鍵を使用してください。
コンフィギュレーションファイルを編集する前の最後の手順として、ログイン用のパスワードのハッシュを作ります。ハッシュはpythonインタープリターで以下のコマンドを実行してください。
from notebook.auth import passwd; passwd()
すると設定したいパスワードを聞かれますので入力します。入力を2回行うとパスワードに基づくsha1ハッシュが生成されます。このハッシュをクオート記号ごとコピーしておいてください。
さて、いよいよコンフィギュレーションファイルの編集です。コンフィギュレーションファイルは~/.jupyter/jupyter_notebook_config.pyです。このファイルをエディタで開いて編集します。ubuntu 16.04は初期状態でviとnanoエディタが使えますので好きな方を使ってください。
コンフィギュレーション・ファイルの各設定項目には簡単な解説が添えられています。また、最初は行頭の”#”文字によってコメントアウトされています。従って、コメントアウトを外し、正しい値を設定していくことになります。設定は以下の6項目です。
c.NotebookApp.certfileとc.NotebookApp.keyfileは、OpenSSLで作ったファイルへのパスを設定してください。以下の例のusernameの部分は自分のログオン名(gmailのアカウント名部分)にしてください。
# OpenSSLで作ったファイルへのパス c.NotebookApp.certfile = u'/home/username/.jupyter/mycert.pem' c.NotebookApp.keyfile = u'/home/username/.jupyter/mykey.key'
c.NotebookAp.ipは’*’を指定します。これは、どの外部アドレスからでも制限なく接続可能にするということです。
# どのIPアドレスからのアクセスも受け入れる c.NotebookApp.ip = '*'
c.NotebookApp.passwordは、名前の通りパスワードを設定します。ここには、先ほど作ったパスワードのハッシュを指定しておきましょう。
# passwd()コマンドで作ったパスワードのハッシュを貼る c.NotebookApp.password = u'sha1:bcd259ccf...'
cNotebookApp.open_browserはFalseにし、jupyterが勝手にブラウザを起動しないようにします。
# 勝手にブラウザを起動しない c.NotebookApp.open_browser = False
最後に外部からアクセスするためのポート番号を指定します。ポート番号については本来用途が番号毎に決まっていますので勝手なことはできません。しかしながら、個人利用のインスタンスですので、そうやかましいことを言わなくてもよいでしょう。Wikpediaの表を参照しながら、ウェルノウン・ポートを避けて割り当ててください。よくわからない方はデフォルトの8888を使ってください。
# 外部からアクセスするためのポート番号を指定する c.NotebookApp.port = 8888
編集が終わったら、適当なワーク・ディレクトリを作り、その中からJupyter Notebookを起動します。
cd ~ mkdir notebook cd notebook jupyter notebook
これでJupyter側は準備完了です。
インスタンスのファイアーウォールを設定する
先ほど作成したVMインスタンスをダッシュボードで開きます。ファイアーウォールのHTTPSにチェックが入っていることを確認し、そのちょっと下にあるネットワーク・カテゴリの「default」をクリックしてください。このクリック先がファイアーウォールの設定です。
ページ中段にファイアーウォール・ルールがあります。ここにJupyter用のルールを書き加えます。
- 名前⇒ 適当に
- ソースタグ⇒ 0.0.0.0/0 どのようなホストからでも接続を許す
- 許可対象のプロトコルまたはポート ⇒ tcp:上で選んだポート名(例 tcp:8888)
設定を保存すると、あとはVMインスタンスのダッシュボードに戻ります。
Jupyter Notebookに接続する
さて、VMインスタンスのダッシュボードに、先ほど作成したインスタンスが表示されています。その「外部IP」の部分に、外部からインスタンスにアクセスするアドレスが表示されていますので、それをクリックします。
この段階ではまだブラウザが開くだけで、接続がエラーになります。なぜならJupyterは設定したポート番号(上の例ではポート8888)でサービスをしているのに、ブラウザは標準のHTTPSポートにアクセスしているからです。
そこで、URLにポート番号を付加します。例えば、
https://104.198.nnn.mmm:8888/ (nnn.mmmは数字)
としましょう。すると今度は画面がかわります。以下はChromeブラウザの例です。
すでに説明しましたが、この警告が出るのはSSLの鍵の署名が勝手なものだからです。ブラウザは「何処の馬の骨が作ったとも知れぬ鍵」と言っているのです。個人利用でこの警告がでることは仕方ありません。
Chromeブラウザの場合、左下の詳細設定をクリックすると、一番下に「104.198.nnn.mmmにアクセスする(安全ではありません)」と表示されます。それをクリックしてください。すると、漸くパスワード入力画面が現れます。
先ほどハッシュを作った時のパスワードをここで入力すると、めでたくJupyter Notebookのホーム画面に遷移します。
これで世界のどこに居てもブラウザいっちょ有ればJupyter Notebookを使えるようになりました。
まとめ
Jupyter Notebookおもしろいです。みんな遊びましょう。