AWS EC2へのJupyterHub(+R)導入についての備忘録

# 目次
- はじめに
- JupyterHubとは
- EC2上への環境構築
    - JupyterHubのinstallと起動
    - JupyterHub上でRも使えるようにする
- まとめ
- 参考情報

# はじめに
アドホック分析のためのリソースとしてAWS EC2を用意してもらったものの、環境構築は自分でなんとかしなければならない、ということがありそうなのでEC2上に最低限の分析環境を構築する手順をまとめ自分用の備忘録としておきます。

# JupyterHubとは
詳しくは[Documentation for JupyterHub](https://jupyterhub.readthedocs.io/en/stable/)に説明がありますが、JupyterHubを利用すると複数人向けのJupyterNotebook利用環境を整備することができます。1つのサーバを複数人のアナリストで共用する際などに便利です。RにおけるRstudioServerのような位置づけだと思います。

# EC2上への環境構築
EC2のAMIはAmazon Linux 2を使っています。以下、EC2へssh接続(ユーザはデフォルトのec2-user)できている前提での手順を記載しています。

## STEP1：Python3のinstall
EC2上で以下コマンドを実行します。

```bash
$sudo amazon-linux-extras install python3
```
## STEP2：pipとJupyterのinstall
以下コマンドを実行します。今回使ったEC2にはデフォルトでPython2系が入っていますが、先程installしたpython3を指定してpipを実行したいため、「$python3 -m pip」として実行しています( 詳しくは[python.jpの環境構築ガイド](https://www.python.jp/install/ubuntu/pip.html)に記載があります)。

```bash
$sudo python3 -m pip install --upgrade pip
$sudo python3 -m pip install jupyter
```
## STEP3：nodejs, npm (Node Package Manager) のinstall
**※ここからはrootユーザにスイッチして作業を進めます。**
EC2ではデフォルトのユーザであるec2-userで以下コマンドを実行すればrootユーザに切り替えることができます。

```bash
$sudo su
```

(ec2-userのままで作業を進めると、構築したJupyterHub環境が他のユーザからは見られなくなるため、途中でrootユーザに切り替えて作業を行っています。)

次に、以下コマンドでnvm(Node Version Manager)をinstallします。

```bash
$curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```
ターミナルから一度出て再ログインし、以下コマンドを実行してnvmのバージョンが表示されればOKです。

```bash
$nvm --version
```

以下コマンドでnodejsをinstallします。ここでnpmも一緒にinstallされます。

```bash
$nvm install node
```
## STEP4：JupyterHubのinstall
以下コマンドを実行してJupyterHubをinstallします。

```bash
# まず、configurable-http-proxyをinstallしておく
$npm install -g configurable-http-proxy

# JupyterHubのinstall
$python3 -m pip install jupyterhub==0.9.6

# installに成功していればJupyterHubのヘルプが表示されます
$jupyterhub -h
```

今回JupyterHubのバージョンを0.9.6に指定してinstallしていますが、指定しなければ最新版(2019/09/24時点では最新版はv1.0.0)がinstallされます。私の環境では、v1.0.0をinstallするとjupyterhub -h コマンド実行時に謎のエラー文言(参考：[Error message when executing jupyterhub -h](https://github.com/jupyterhub/jupyterhub/issues/2568)
)が出たため、敢えて古いバージョンのv0.9.6を指定してinstallすることにしました。

## STEP5：configファイル作成
configファイルを作成したいディレクトリに移動して、以下コマンドを実行します。

```bash
$jupyterhub --generate-config
```
## STEP6：configファイルの編集
アクセス権限付与するユーザをホワイトリスト形式でconfigファイルに記載します。詳しくは[Authentication and User Basics](https://jupyterhub.readthedocs.io/en/stable/getting-started/authenticators-users-basics.html)に記載されています。

```bash
#アクセス許可するユーザをホワイトリスト形式で記載。デフォルトの認証方法はPAM
c.Authenticator.whitelist = {'user01', 'user02'}

# 管理者権限のユーザを記載
c.Authenticator.admin_users = {'user01'}
```

以下コマンドで試しに起動してみます。

```bash
$jupyterhub
```

「http://<*ec2のip*>:8000」をブラウザで開くと以下のログイン画面が表示されます。configファイルに設定したユーザ、パスワードでログインできるようになっています。
![スクリーンショット 2019-09-24 22.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395388/5caa4101-0537-bca9-2ff1-739223308b27.png)

ログイン後の画面。(既に.ipynbファイルが置いてありますが、初めてログインした際は何もないです。)
![スクリーンショット 2019-09-24 22.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395388/5ed90bec-ebaa-99ae-939d-bd4429be92a4.png)
Pythonを使うだけならこれでOKなのですが、欲張ってJupyterからRも実行できるようにしてみようと思います。

## STEP7：R環境の準備
R実行環境の準備はクラスメソッドさんの記事([AWS EC2(Ubuntu 16.04)にJupyterHub＋R実行環境を構築する](https://dev.classmethod.jp/cloud/aws/aws-ec2-ubuntu1604-jupyterhub-renvironment/))でほぼ問題なく進めることができました。ただ、内容がやや昔のものであるためか、自分の環境(EC2)ではapt-getコマンドが使えなかったため、Rのinstallにamazon-linux-extrasを使う点は変更しています。

EC2にec2-userとしてssh接続して以下コマンドを実行します。

```bash
$sudo amazon-linux-extras install R3.4
```

installが問題なければ、以下コマンドでRのバージョン情報が表示されます。

```bash
$R --version
```

以下のように$R を実行するとR環境に入ります。

```bash
$ R

# (以下、実行結果)
# R version 3.4.3 (2017-11-30) -- "Kite-Eating Tree"
# Copyright (C) 2017 The R Foundation for Statistical Computing
# Platform: x86_64-koji-linux-gnu (64-bit)

# R は、自由なソフトウェアであり、「完全に無保証」です。
# 一定の条件に従えば、自由にこれを再配布することができます。
# 配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

# R は多くの貢献者による共同プロジェクトです。
# 詳しくは 'contributors()' と入力してください。
# また、R や R のパッケージを出版物で引用する際の形式については
# 'citation()' と入力してください。

# 'demo()' と入力すればデモをみることができます。
# 'help()' とすればオンラインヘルプが出ます。
# 'help.start()' で HTML ブラウザによるヘルプがみられます。
# 'q()' と入力すれば R を終了します。

>
```

R環境で以下コマンドを実行し、パッケージinstallとJupyter上で実行する準備をします。

```bash
# パッケージのinstall
> install.packages(c('rzmq','repr','IRkernel','IRdisplay'), repos = c('http://irkernel.github.io/', getOption('repos')))

# kernelをJupyter上で使えるようにする
> IRkernel::installspec()

# R環境から出る
> q()
# Save workspace image? [y/n/c]: y
$ 
```

JupyterHubを再起動すると、以下のように「New」からRのNotebookが選択できるようになっていました。
![スクリーンショット 2019-09-24 22.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395388/8c8a5365-f4ce-a163-d788-9f07cb16110b.png)
試しにRコードを実行してみたところ、問題なく実行できました。
![スクリーンショット 2019-09-24 22.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395388/2f99945b-f6a2-e232-7b59-b0480fee159e.png)
# まとめ
EC2ではapt-getが使えなかったり、ec2-userのまま作業を進めると他ユーザからJupyterHubが見えなかったりするなど、色々な壁にぶち当たりましたが、なんとか試行錯誤の末、最低限の環境を作るに至りました。本来はsysmdを使用した自動実行までやっておくと良いと思います。インフラ周りの知識、AWSの知識がまだまだ足りないと感じますが、データ分析とバランスをとりつつ勉強していければと思います。


# 参考情報
- [[1]JupyterHub documentation](https://jupyterhub.readthedocs.io/en/stable/)
- [[2]R kernel for Jupyter Notebook](https://irkernel.github.io/installation/)
- [[3]AWS EC2(Ubuntu 16.04)にJupyterHub＋R実行環境を構築する](https://dev.classmethod.jp/cloud/aws/aws-ec2-ubuntu1604-jupyterhub-renvironment/)
- [[4]Amazon Linux 2 で Jupyter Notebook を使ってみた](https://dev.classmethod.jp/etc/amazon-linux-2-jupyter-notebook/)
- [[5]チュートリアル: Amazon EC2 インスタンスでの Node.js のセットアップ](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)
- [[6]Amazon Linux - Node.js と npm をインストールする](https://qiita.com/leomaro7/items/2c3a767bbbb6cc535b19)
- [[7]Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた](https://dev.classmethod.jp/cloud/aws/how-to-work-with-amazon-linux2-amazon-linux-extras/)