Anacondaを利用してCompute Engineのインスタンス上にJupyter Notebookを導入する

#はじめに
先日GCPのセットアップ時にJupyter Notebookの導入で詰まってしまったのと、[参考にしたブログ](http://bfin.sakura.ne.jp/?p=923)が少し古かったので自分用にこちらに方法をまとめておきます。
既にAnacondaを導入していたので、Dockerを使わずにAnaconda上でJupyter Notebookを動かします。
Docker経由の環境構築は[こちら](http://enakai00.hatenablog.com/entry/2016/07/03/201117)などを参考にしてみてください。

#実行環境
- n1-standard-1（vCPU x 1、メモリ 3.75 GB）
- Ubuntu 16.04.3
- Anaconda 3.4.0

Anacondaを入れてない人は

```bash:install_anaconda
$ wget http://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh
$ bash Anaconda3-4.0.0-Linux-x86_64.sh
```

でインストールして

```bash:install_anaconda
Do you wish the installer to prepend the 
Anaconda3 install location to PATH 
in your /home/haroldsoh/.bashrc ? 
[yes|no][no] >>> yes
```

と答えてPATHを通して

```bash:install_anaconda
$ source ~/.bashrc
```

とすれば使えます。

# 実際にJupyter Notebookを導入してみる
## Jupyter Configの作成
まずはVMを立ち上げ、Jupyter NotebookのConfigファイルを作ります。

```bash:generate_config
$ cd ~
$ jupyter notebook --generate-config
$ cd .jupyter
```

次にSSL用の鍵を作成します。
実行ディレクトリに生成されるので.jupyterに移動していることを確認してください。

```bash:generate_ssh
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
```

実行すると組織名やらメールアドレスやら聞かれるので適当に入力。
公式な署名ではないので、個人利用にとどめましょう。
最後にpythonでログイン用のパスワードのハッシュを作ります。
まずはpythonインタープリターに切り替えます。

```bash:into_python
$ python
```

pythonインタープリターが立ち上がったらハッシュを作成しましょう。

```py3:generate_hash
>>> from notebook.auth import passwd; passwd()
```

設定したいパスワードを尋ねられるので、2回入力するとsha1ハッシュが生成されます。
このパスワードは最後Jupyter Notebookへのログインに使うので忘れないように。
sha1はこと後すぐ使うのでクオート記号（'）ごとコピーしておきます。

私は当時pythonコードの実行方法すら知らなかったので、そんな人のために画像も載せておきます。
![password.png](https://qiita-image-store.s3.amazonaws.com/0/204294/08ab8a76-a50b-d4f1-0620-c0a6af0b92ce.png)
こんな感じでpythonインタープリターに入ると白い文字になり、`>>>`が左端に現れるので、そこで`from notebook....（以下略）`を入力です。

## Jupyter Configの設定
次に実際にConfigを設定していきます。
まずは`vi`コマンドでConfigファイルを開きます。

```bash:open_config
$ cd .jupyter
$ vi jupyter_notebook_config.py
```

するとConfigファイルが開くので以下の項目を追加していきます。
`vi`コマンド中は`i`でインサートモードになり、終了時は`esc`ボタンを押した後`:wq`で「保存して終了」が行えます。
なお、下記の`username`は**自分のアカウント名を入力**してください。
（VMを開くと出る`hogehoge@instance-1:`の*hogehoge*が該当）

```vim:edit_config
# OpenSSLで作ったファイルへのパス
c.NotebookApp.certfile = u'/home/username/.jupyter/mycert.pem'
c.NotebookApp.keyfile  = u'/home/username/.jupyter/mykey.key'

# どのIPアドレスからのアクセスも受け入れる
c.NotebookApp.ip = '0.0.0.0'

# passwd()コマンドで作ったパスワードのハッシュを貼る
c.NotebookApp.password = u'sha1:b2e7b90...'

# 勝手にブラウザを起動しない
c.NotebookApp.open_browser = False

# 外部からアクセスするためのポート番号を指定する
c.NotebookApp.port = 8888
```

最後にJupyter Notebookを起動します。

```bash:run_jupyter
$ cd ~
$ jupyter notebook
```

##VMインスタンスのファイアーウォールの設定
Jupyter Notebookを起動したらCompute Engineのコンソールを開きます。
現在Jupyter Notebookを導入しようとしているインスタンスの詳細を開き、ファイアーウォールで`HTTPSトラフィック`が許可されているか確認します。
許可されていなければ、上部の青字の`編集`から許可するよう変更してください。
![check_firewall_https.png](https://qiita-image-store.s3.amazonaws.com/0/204294/ed93c397-ee0d-5439-23e1-8b71266c1b0c.png)

今確認したファイアーウォールの一つ上、ネットワーク インターフェースの`default`をクリックし、設定画面に進みます。
ページ遷移後中断まで移動し、ファイアウォールルールを追加します。
![firewall_rule.png](https://qiita-image-store.s3.amazonaws.com/0/204294/6a93d768-de75-db91-d652-cbb01ae67852.png)

設定画面では、以下のように設定します。
・ターゲットタグ　https-server
・ソースタグ　0.0.0.0/0
・指定したプロトコルとポート　tcp:8888
![new_firewall_rule.png](https://qiita-image-store.s3.amazonaws.com/0/204294/a581f85d-033a-a44c-cc63-b2112aa959a9.png)

設定後、ファイアーウォールルールに追加されていることを確認しましょう。
![chcek_new_firewall.png](https://qiita-image-store.s3.amazonaws.com/0/204294/534b9e96-98e4-08cc-48a7-b95a5c6267d7.png)

以上でコンソール上でのファイアーウォールの設定は終了です。

## Jupyter Notebookに接続する。
やっとJupyter Notebookに接続できますね。
ということでコンソールから接続してみましょう。
VMインスタンスのダッシュボードから、先ほどのインスタンスの`外部IP`をクリックし接続してみましょう。
（この時Jupyter Notebookが起動していない場合は、ssh接続し、`$ jupyter notebook`で起動してください。）
![external_ip.png](https://qiita-image-store.s3.amazonaws.com/0/204294/f0f70561-0b65-8b66-032e-d9f35db6210e.png)


~~やっとJupyter Notebookに接続できましたね。~~

![access_dinied.png](https://qiita-image-store.s3.amazonaws.com/0/204294/388203df-2a47-7f19-d481-04411dac7036.png)

残念ながらアクセスエラーが発生しましたが、大丈夫です。
Jupyterは設定したポート番号（8888）でサービスをしているのに、今開いたブラウザは標準のHTTPSポートにアクセスしているのでエラーが発生しているそうです。
なので、ポート番号を指定して再度アクセスしてみます。

```:access_jupyter
https://35.***.102:8888/
```
すると、このような警告が出ると思います。
![setp_for_access.png](https://qiita-image-store.s3.amazonaws.com/0/204294/52ee26e7-a8dd-b752-ada5-b18546be4b1d.png)

これはJupyter Configで作成した署名が公式なものではないので、「怪しいサイトかもしれませんよー」とブラウザが教えてくれているそうです。
もちろん怪しいサイトではないので、`詳細設定`を押してアクセスします。
![yes_access.png](https://qiita-image-store.s3.amazonaws.com/0/204294/fe6a3e87-18bf-332f-260b-144da2ff267c.png)

すると、パスワードを求められるので、Jupyter Configでsha1ハッシュを作成する際に利用したパスワードを入力してください。
![jupyter_pw.png](https://qiita-image-store.s3.amazonaws.com/0/204294/7dcd44d5-08c0-1dd4-6a9d-ade00d3aa6ff.png)

無事Jupyter Notebookに接続できました。
![now_jupyter_available.png](https://qiita-image-store.s3.amazonaws.com/0/204294/1178fee1-909d-ebab-951c-a7f3395eb16e.png)

#参照
1. [Google Cloud Platform で Jupyter のサービスを動かす](http://bfin.sakura.ne.jp/?p=923)