どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

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

f:id:predora005:20200920114859j:plain
Amazon Linux 2でJupyter Notebookを使えるようにするまで*1

※ 2020/02/26にQrunchで書いた記事を移行しました。

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が起動してればログイン画面が表示されます。

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

f:id:predora005:20200920114447j:plain

[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

*1:Photo MixによるPixabayからの画像