プロキシのある社内から利用できるjupyter notebook（GPU、EC2、ubuntu16.04、TensorFlow）の構築

# はじめに

主に下記を参考にさせていただきました
ubuntu 16.04が使いたかったので、その部分が違います

Proxyが厳しい企業内からも利用できるJupyter NotebookをAWS上に用意する
https://qiita.com/shunyas/items/3fa1a0f9e3287b6fb5bf

AWSのGPUインスタンスでJupyter Notebookを実行する(Windows 2018/07版)
https://qiita.com/nicco_mirai/items/1da092912adbce71b82b


一通りやるのに1～2時間ぐらいかかると思われます

# 手順

## 前提

### 利用環境
- ブラウザの80と443しかポートがあいてない環境
- AWSのアカウントがある
- AWSにブラウザで接続できる


### 構築環境
- ブラウザのポート自由
- AWSのアカウントがある
- AWSにブラウザで接続できる
- AWSにSSHで接続できる

## 1 利用環境でEC2の準備をする

AWSに繋がる確認も含めて利用環境からサインインしてバージニア北部に移動します
EC2ダッシュボードから、インスタンスの作成をします
「Ubuntu」で検索すると下記が表示されるので、これを選択してください

> Ubuntu Server 16.04 LTS (HVM), SSD Volume Type 

インスタンスタイプは p2.2xlarge　を選択してください
Volume Storage は20Gにしてください


## 2 構築環境でjupyter notebookのインストール

- 2-1 SSHで作成したEC2インスタンスに接続する

puttyで接続する場合は、インスタンス作成時に保存したキーペアの.pemファイルを.ppkファイルに変換します

参考
pem ⇒ ppk 変換
https://qiita.com/naka46/items/3297242f3386b5f9e3dc


AWSにログインして作成したEC2のインスタンスの「パブリック DNS (IPv4)」を調べputtyのHostに入力します
puttyのconnection -> SSH -> Auth　にあるPrivate key file for authenticationに変換したppkファイルを指定します
puttyのconnection -> Data にあるAuto-login username に ubuntu と入力します
これでOpenを押して接続します

下記を参考にしました
AWSのGPUインスタンスでJupyter Notebookを実行する(Windows 2018/07版)
https://qiita.com/nicco_mirai/items/1da092912adbce71b82b#%E4%BB%BB%E6%84%8F%E3%81%AEssh%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E5%85%A5%E3%82%8B

- 2-2 下記を参考にしてjupyter notebookをインストールします

英語ですが、コマンド部分を上から順にコピペすればできます
コマンド部分は$の行です
tensorFlowの動作確認の部分は飛ばしたほうがいいと思います


Setup TensorFlow GPU with AWS EC2 on Ubuntu 16.04 in 10 minutes.
https://medium.com/@dichen_5479/setup-tensorflow-gpu-with-aws-ec2-on-ubuntu-16-04-in-10-minutes-7ee64e47a66a

10minitesとかいてますが、私は30分はかかりました
p2.xlargeですと、0.5ドルぐらいですね

## 3 構築環境でjupyter notebookの確認

- 3-1 セキュリティグループの設定

作成したEC2インスタンスのセキュリティグループの「インバウンド」を開いて編集を押す
「カスタム TCP ルール」
「ポート範囲」を8888
ソースを「任意の場所」
にして保存する

ルールの追加で
「HTTPS」
ソースを「任意の場所」
を選択して保存する

- 3-2 画面の確認

「2 構築環境でjupyter notebookのインストール」を最後まで実行すると、下記のような文字列が表示されます

```
http://localhost:8888/?token=abcdefg12345jkfatecateta
```

localhostを、「パブリック DNS (IPv4)」に変更してブラウザで開くと、jupyter notebookが表示されています

## 4 構築環境で自動起動の設定

ここからは下記を参考にします

Proxyが厳しい企業内からも利用できるJupyter NotebookをAWS上に用意する
https://qiita.com/shunyas/items/3fa1a0f9e3287b6fb5bf


「Port 8888 を Proxyが通過できる443へフォワードする」以降を実施します

上記ではエディタをnano で編集していますが、操作がわからないのでviで実施しました

「起動スクリプト」はパスがかわります

```
source /home/ubuntu/src/anaconda3/bin/activate root
↓
source /home/ubuntu/miniconda3/bin/activate root
```

「GPU用の環境変数の設定」に関しては

AWSのGPUインスタンスでJupyter Notebookを実行する(Windows 2018/07版)
https://qiita.com/nicco_mirai/items/1da092912adbce71b82b#ssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E3%82%8B

「SSL証明書を作る」
「パスワードのハッシュを作る」
「Jupyter Notebook(Lab)の構成ファイルを作る」
の3つを実施してからになります

c.NotebookApp.certfile と c.NotebookApp.keyfile のパスはsslかcertかどちらかにそろえてください 

パスワードはsha1からの文字列になります
あと下記にしないとエラーになりました

```
c.NotebookApp.ip = '*'
↓
c.NotebookApp.ip = '0.0.0.0'
```
minicondaをインストールしているので、

## 5 利用環境で確認

AWSにサインインして、EC2を再起動
https://パブリック DNS (IPv4)
に「この接続ではプライバシーが保護されません」、「このサイトの閲覧を続行する (推奨されません)。 」を突破してアクセスして
jupyter notebook のログイン画面が表示されたら完了です
ログインのパスワードは「パスワードのハッシュを作る」で入力した文字列です

# おわりに

プロキシには負けたくない