EC2(Ubuntu 18.04 LS)にJupyter Notebookをインストールしてみた

はじめに

こんにちは、岩城です。
EC2(Ubuntu 18.04LS)にJupyter Notebookをインストールする機会がありました。
備忘録として残しておきます。

構成

本エントリの構成を以下に示します。
本来は、インターネットからアクセスする場合、リバースプロキシを介すなど、セキュリティ面で考慮すべき点があります。ご留意ください。

やってみた

EC2インスタンスの作成

  • Ubuntu Server 18.04 LTS (HVM)を選択します
  • ルートボリュームのサイズを増やします
    • デフォルト8GBですが、Anacondaインストール時に容量が足りなくて失敗します
    • 私は単にインストールして動作確認することが目的だったので、20GBにしました

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

  • インスタンスに関連付けたセキュリティグループを編集します
    • 本エントリでは以下のポートへの接続を制限するために作業端末のIPアドレスを指定します
      • SSH接続するための22ポート
      • Jupyter Notebookに接続するための8888ポート

pyenvをインストール

インスタンスにログインして以下の作業を行います。

## パッケージを最新化
$ sudo apt update
$ sudo apt upgrade

## pyenvをインストール
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

## pyenvにパスを通す
$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="${PYENV_ROOT}/shims:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

## .bash_profileを確認
$ cat ~/.bash_profile
export PYENV_ROOT="${HOME}/.pyenv"
export PATH="${PYENV_ROOT}/bin:$PATH"
export PATH="${PYENV_ROOT}/shims:$PATH"
eval "$(pyenv init -)"

## .bash_profileを再読込
$ source ~/.bash_profile

Anacondaをインストール

Anacondaをインストールします。

## パッケージリストにanaconda3系があることを確認
$ pyenv install --list | grep anaconda3

## Anacondaをインストール
$ pyenv install anaconda3-5.3.1

## Anacondaにパスを通す
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin:$PATH"' >> ~/.bash_profile

## .bash_profileを確認
$ cat ~/.bash_profile
export PYENV_ROOT="${HOME}/.pyenv"
export PATH="${PYENV_ROOT}/bin:$PATH"
export PATH="${PYENV_ROOT}/shims:$PATH"
eval "$(pyenv init -)"
export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin:$PATH"

## .bash_profileを再読込
$ source ~/.bash_profile

## インストールできたことを確認
$ pyenv versions
* system (set by /home/ubuntu/.pyenv/version)
  anaconda3-5.3.1 (set by /home/ubuntu/.pyenv/version)

## Anacondaに切り替える
$ pyenv global anaconda3-5.3.1

## 切り替わったことを確認
$ pyenv versions
  system
* anaconda3-5.3.1 (set by /home/ubuntu/.pyenv/version)

## Anaconda, Incが表示されることを確認
$ python
Python 3.7.0 (default, Jun 28 2018, 13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>quit()

Jupyter Notebookのセットアップ

リモートからJupyter Notebookにアクセスするための設定を行います。
まずは、ログイン時に利用するパスワードのハッシュ値(sha1:XXXXXXX)を出力し、控えておきます。

$ ipython3
In [1]: from IPython.lib import passwd
In [2]: passwd()
Enter password:<パスワードを入力>
Verify password:<もう一度パスワードを入力>
Out[2]: 'sha1:XXXXXXXXXXXXXXXXX'
Out[3]: quit()

次に、リモートアクセスのための設定を行います。

$ jupyter-notebook --generate-config

$ vi ~/.jupyter/jupyter_notebook_config.py
c.IPKernelApp.pylab = 'inline' #matplotlibで描画したものがJupyter Notebook上で表示可能となる
c.NotebookApp.ip = '*' #Jupyter NotebookにアクセスできるIPを制限
c.NotebookApp.open_browser = False #Jupyter Notebook起動後にブラウザの自動起動を拒否
c.NotebookApp.port = 8888 #ポート指定(デフォルト8888)
c.NotebookApp.password = u'sha1:XXXXXXX(#先ほど保存したハッシュ値を記載)'

Jupyter Notebookを起動します。

$ jupyter-notebook &

Jupyter Notebookに接続

http://xxx.xxx.xxx.xxx:8888/loginにアクセスして以下の画面が表示されます。


パスワードを入力してログインできればOKです。

Jupyter Notebookの自動起動

このままの設定では、インスタンスを再起動および停止した場合、毎回jupyter-notebook &を実行して起動しなければなりません。そこでsystemdにサービスを登録してインスタンス起動時にJupyter Notebookを起動するようにします。

まずは、QuitをクリックしてJupyter Notebookを停止します。

## サービスファイルの作成
$ sudo vi /etc/systemd/system/notebook.service
[Unit]
Description = Jupyter Notebook
[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/home/ubuntu/.pyenv/versions/anaconda3-5.3.1/bin/jupyter notebook
WorkingDirectory=/home/ubuntu
User=ubuntu
Group=ubuntu
Restart=always
[Install]
WantedBy = multi-user.target

## サービスに登録されていることを確認
$ sudo systemctl list-unit-files --type=service |grep notebook
notebook.service                               disabled  

## 起動
$ sudo systemctl start notebook

## 起動確認
$ sudo systemctl status notebook
● notebook.service - Jupyter Notebook
   Loaded: loaded (/etc/systemd/system/notebook.service; disabled; vendor preset
   Active: active (running) since Sun 2019-02-10 06:58:54 UTC; 10s ago
 Main PID: 18873 (jupyter-noteboo)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/notebook.service
           └─18873 /home/ubuntu/.pyenv/versions/anaconda3-5.3.1/bin/python /home
~以下省略

## 停止
$ sudo systemctl stop notebook

## 停止確認
$ sudo systemctl status notebook
● notebook.service - Jupyter Notebook
   Loaded: loaded (/etc/systemd/system/notebook.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
~以下省略

## 自動起動の設定
$ sudo systemctl enable notebook
Created symlink /etc/systemd/system/multi-user.target.wants/notebook.service → /etc/systemd/system/notebook.service.

## 自動起動が有効になっていることを確認
$ sudo systemctl list-unit-files --type=service |grep notebook
notebook.service                               enabled

再起動後、http://xxx.xxx.xxx.xxx:8888/loginにアクセスして画面が表示されれば完了です。

$ sudo shutdown -r now

おわりに

本エントリが誰かの役に立てれば幸いです。