BETA

Amazon Linux 2でJupyter Notebookを使えるようにするまで

投稿日:2020-02-26
最終更新:2020-02-26

Jupyter Notebookは機械学習を実行する環境として有名です。
機械学習には触れてきましたが、Jupyter Notebookには触れてこなかったので使ってみようと思いました。
使用する言語はPython3です。

なぜAmazon Linuxなのか

私がAWSを使い慣れているから、ただそれだけです。
Google ColaboratoryやGCP, 御自分のPCでJupyter Notebookを使われても問題ないと思います。むしろ、そちらの方が便利かもしれません。

[1] EC2インスタンスを作成する

OSがAmazon Linux2のEC2インスタンスを作成します。
NAT構成などは考えず、シンプルな1台構成の場合について書きます。

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

インバウンド

ブラウザからJupyter Notebookにアクセスするために、ポート8888を許可します。
ポート番号は8888以外でも可能です。このあと行うJupyter Notebookの設定と一致していれば問題ありません。

タイプ プロトコル ポート範囲 ソース
カスタム TCP ルール TCP 8888 0.0.0.0/0
SSH TCP 22 0.0.0.0/0

アウトバウンド

タイプ プロトコル ポート範囲 ソース
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0

[2] 各種パッケージをインストール

[2-1] yumのupdate

お決まりの手順ですが、まずはyumのupdateを行います。

$ sudo yum -y update  

[2-2] Python3のインストール

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

$ sudo yum -y install python3 python3-devel  

[3] Jupyter Notebookのインストールと設定

[3-1] Jupyter Notebook用のユーザー作成

Jupyter Notebook実行用のユーザーを作成します。

$ sudo useradd jupyter  
$ sudo passwd jupyter  

[3-2] Jupyter Notebookのインストール

[3-1]で作成したユーザーにスイッチし、jupyterをインストールします。
(1)Anacondaをインストールする方法と、(2)Jupyter Notebook単体でインストールする方法の2種類ありますが、(2)Jupyter Notebook単体でインストールする方法を採用しました。

$ su - jupyter  
$ pip3 install jupyter --user  

Anacondaであればデータサイエンスに必要な各種ライブラリがまとめてインストールされますが、容量を食いそうなので、Jupyter Notebook単体でインストールしておきます。

[3-3] Jupyter Notebookの設定1

jupyter_notebook_config.pyというファイルに設定情報を書いていきます。

$ mkdir .jupyter  
$ vim .jupyter/jupyter_notebook_config.py  

jupyter_notebook_config.pyの中身は次の通りです。

c.NotebookApp.notebook_dir = '/home/jupyter/'  
c.NotebookApp.ip = '*'  
c.NotebookApp.open_browser = False  
# c.NotebookApp.port = 8888 # デフォルトは8888  

jupyter notebook --generate-configを叩くと、~/.jupyter/jupyter_notebook_config.pyを雛形として作ってくれますが、雛形は使用せず最低限の情報だけを書きました。

[3-4] Jupyter Notebookの設定2

このままだとセキュリティ的によろしくないので、パスワード認証を追加します。

python3 -c 'from notebook.auth import passwd;print(passwd())'  
Enter password:   
Verify password:   
sha1:*****************************************************  

表示されたsha1:***をコピーし、jupyter_notebook_config.pyc.NotebookApp.passwordにペーストします。

c.NotebookApp.password = 'sha1:*****************************************************`  

[4] 動作確認

[4-1] Jupyter Notebookの起動

$ jupyter notebook  
[I 14:36:03.057 NotebookApp] Writing notebook server cookie secret to /home/ec2-user/.local/share/jupyter/runtime/notebook_cookie_secret  
[W 14:36:03.245 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.  
[I 14:36:03.248 NotebookApp] Serving notebooks from local directory: /home/ec2-user/.jupyter  
[I 14:36:03.248 NotebookApp] The Jupyter Notebook is running at:  
[I 14:36:03.248 NotebookApp] http://ip-10-3-0-10.ap-northeast-1.compute.internal:8888/  
[I 14:36:03.248 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).  

[4-2] ブラウザから接続

ブラウザでhttp://[EC2インスタンスのグローバルIP]:8888にアクセスします。
JupyterNotebookが起動してればログイン画面が表示されます。

先ほど設定したパスワードを入力すると無事にログインできました。

[5] Jupyter Notebookを自動起動する

CentOS7にJupyter Notebookを導入サービス化したJupyter notebookからローカルに構築したtensorflowを使えるようにしたを参考にさせていただきました。

[5-1] jupyterのパスを確認する

このあと作成するユニットファイルに、jupyterのフルパスを設定します。

$ which jupyter  
~/.local/bin/jupyter  

[5-2] ユニットファイルを作成する

ここからはec2-userで操作を行います。jupyterユーザーはsudoersではないので
(jupyterユーザーをsudoersに追加する方法でも問題ありません)。

$ exit  
logout  

jupyter用のユニットファイルを作成します。

$ sudo vim /etc/systemd/system/notebook.service  

ユニットファイルの内容は以下の通りです。

[Unit]  
Description = Jupyter Notebook  

[Service]  
Type=simple  
PIDFile=/var/run/jupyter-notebook.pid  
ExecStart=/home/jupyter/.local/bin/jupyter notebook  
WorkingDirectory=/home/jupyter/  
User=jupyter  
Group=jupyter  
Restart=always  

[Install]  
WantedBy = multi-user.target  

[5-3] EC2インスタンス立上時に起動する

$ sudo systemctl enable notebook  
Created symlink from /etc/systemd/system/multi-user.target.wants/notebook.service to /etc/systemd/system/notebook.service.  

[5-4] 本当に起動しているのか確認する

$ systemctl status notebook  
● notebook.service - Jupyter Notebook  
   Loaded: loaded (/etc/systemd/system/notebook.service; enabled; vendor preset: disabled)  
   Active: active (running) since 火 2020-02-25 16:28:19 UTC; 30s ago  

終わりに

手順がそれなりに多かったため少々面倒でした。
頻繁にEC2インスタンスの削除・作成を行う場合は、コード化した方がよいでしょう。
パスワード入力のところ以外はコード化可能だと思います(パスワード入力も不可能ではありませんがやりたくはない)。

また、今回はSSL/TLSは使いませんでしたが、セキュリティ的には使った方がよいでしょう。
Running a notebook server — Jupyter Notebook 7.0.0.dev0 documentation

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

役に立つことから立たないことまで日々のアウトプットを綴る

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう