【AWS】Amazon Linux 2でJupyter Notebookを使えるようにするまで
Amazon Linux 2でJupyter Notebookを使えるようにするまで*1
※ 2020/02/26にQrunchで書いた記事を移行しました。
Jupyter Notebookは機械学習を実行する環境として有名です。 機械学習には触れてきましたが、Jupyter Notebookには触れてこなかったので使ってみようと思いました。 使用する言語はPython3です。
- なぜAmazon Linuxなのか
- [1] EC2インスタンスを作成する
- [2] 各種パッケージをインストール
- [3] Jupyter Notebookのインストールと設定
- [4] 動作確認
- [5] Jupyter Notebookを自動起動する
- 終わりに
なぜ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.py
のc.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