JupyterHub 環境 を AWS 上に構築しよう
JupyterHub 環境 を AWS 上に構築しよう
JupyterHub を EC2上に構築する
JupyterHub を EC2上に構築してみての気づきとか注意点とかを書きたい。
今回はとりあえずインスタンスを建てて検証するので証明書などを使ったhttps の通信はしません。
本格的にやるのであれば、ロードバランサーを配置して証明書をインストールしましょう。
JupyterHub
JupyterHubとは
マルチユーザに対応した JupyterLab 環境のことです。
ユーザ毎にJupyterLab 環境 を提供することができます。
学術機関などでは機械学習環境として提供されることが多いようです。
構築方法
ネット上ではAnaconda や miniconda を使って構築されるケースが散見されますが
Python3 を 使って構築します。
バックエンドのインフラについては k8s が 使われることが多いですが
スケール要件はない為、シングル構成のEC2 に構築します。
Web上で JupyterHub をホストしますが、ホストには Node.js を使います。
こちらについても、nginx を用いた構築が多いですが
Node.js の Config Proxy
を使ってホストします。
構築スタート
EC2 の構築
まずはEC2を構築します。
今回はterraform を使ってEC2を構築します。
JupyterHub の 構築
EC2 に SSHでログインします。
※SSM でも可
まずはroot にスイッチします。
※以降のコマンドは sudo
なしでも実行できますが、一般ユーザでも実行できるように sudo
をつけて解説します。
sudo su -
Python のバージョンを確認します。
python3 -V
バージョンはPython3.7.10です。
pip を アップグレードします。
sudo python3 -m pip install --upgrade pip
JupyterHub の 構築に必要なパッケージをインストールします。
sudo python3 -m pip install jupyterhub jupyterlab notebook sudospawner
これでJupyterHuub が セットアップできました。
nvm をインストールする
JupyterHub の セットアップが完了しましたが、今の状態だとホストできていない為
nvm を インストールします。
sudo yum -y update
sudo yum -y install gcc-c++
sudo yum -y install git
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
nvm の インストールが終わりましたら .bash_profile
に nvm をセットしておきます。
Node.js を インストールする
nvm を 使ってNode.js をインストールします。
今回はLTSでv14.19.3
を インストールします。
まずはLTSのバージョンを調べます。
nvm ls-remote | grep "(Latest LTS*"
14.19.3 が ありましたら 以下のコマンドを実行してNode.js をインストールします。
nvm install 14.19.3
nvm use v14.19.3
インストールができているかチェックしてみましょう。
node -v
configurable-http-proxy をインストールする
JupyterHubをリバースプロキシでホストします。
npm を 使ってconfigurable-http-proxy
をインストールします。
npm install -g configurable-http-proxy
JupyterHub ログイン用のadminユーザを作成する
ユーザを作成してパスワードを設定します。
sudo useradd jupyter
sudo usermod -aG wheel jupyter
passwd jupyter
ログインの設定
JupyterHub の トップ画面でログインIDとパスワードが合っているにも関わらず
ログインできない場合があります。
そうならないように shadow ファイルに権限を設定しておきます。
# shadowグループの追加
sudo groupadd shadow
# /etc/shadowファイルをshadowグループに変更
sudo chgrp shadow /etc/shadow
# /etc/shadowファイルのshadowグループにread権限追加
sudo chmod g+r /etc/shadow
# jupyterhubユーザをshadowグループに追加
sudo usermod -a -G shadow jupyter
jupyter ユーザにスイッチする
# jupyter ユーザにスイッチ
sudo su jupyter
JupyterHub のコンフィグを作成する
JupyterHub の設定を保存しておくファイルを作成します。
sudo mkdir ../../opt/jupyterhub
sudo /usr/local/bin/jupyterhub -f ../../opt/jupyterhub/jupyterhub_config.py --generate-config
notebookの格納先を作成します。
sudo mkdir ../jupyter/notebooks
コンフィグを書き換えます。
echo "" > ../../opt/jupyterhub/jupyterhub_config.py
sudo vi ../../opt/jupyterhub/jupyterhub_config.py
# 検証用コンフィグ
c.JupyterHub.confirm_no_ssl = True
c.JupyterHub.base_url = '/'
c.Authenticator.admin_users = {'jupyter'}
user_path = '/home/{username}/notebooks'
c.Spawner.notebook_dir = user_path
c.Spawner.default_url = user_path
# ユーザ作成
c.LocalAuthenticator.create_system_users=True
c.LocalAuthenticator.add_user_cmd = ['./add_user.sh']
add_user.sh
は jupyterhub_config.py
と同じディレクトリに保存します。
touch ../../opt/jupyterhub/add_user.sh
vi ../../opt/jupyterhub/add_user.sh
#!/bin/bash
# jupyterhub user add operations
username="${1}"
# some operation
sudo useradd -p $(perl -e 'print crypt("password", "\$6\$salt03")') -d /home/$username -G jupyter $username
sudo mkdir /home/$username/notebooks
sudo chmod 007 /home/$username/notebooks
add_user.sh
の権限を変更します。
chmod 777 add_user.sh
サービスとして登録する
これで起動ができるようになりますが、現状ではターミナル上でのみ実行できない為
バックグラウンドで実行できるようにサービスを作成します。
sudo vi /lib/systemd/system/jupyterhub.service
[Unit]
Description=Jupyterhub
[Service]
User=root
Environment="PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/sudo:/usr/bin:/root/.nvm/versions/node/v14.19.3/bin"
ExecStart=/usr/local/bin/jupyterhub --url 0.0.0.0 -f /opt/jupyterhub/jupyterhub_config.py
WorkingDirectory=/opt/jupyterhub
[Install]
WantedBy=multi-user.target
終わりましたら、サービスを enable
にして start
します。
sudo systemctl enable jupyterhub.service
sudo systemctl start jupyterhub.service
sudo systemctl status jupyterhub.service
ステータスの内容がrunning
になっていればOKです。
jupyterhub.service - Jupyterhub
Loaded: loaded (/usr/lib/systemd/system/jupyterhub.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2022-05-29 10:53:15 UTC; 39ms ago
Main PID: 11562 (jupyterhub)
CGroup: /system.slice/jupyterhub.service
└─11562 /bin/python3 /usr/local/bin/jupyterhub --url 0.0.0.0 -f /opt/jupyterhub/jupyterhub_config.py
May 29 10:53:15 ip-172-31-6-121.us-east-2.compute.internal systemd[1]: Started Jupyterhub.
最後にログイン
http://EC2のPublic IP/hub/login にアクセスします。
ユーザIDとパスワードはPAM認証を利用している為、Linux のユーザIDとパスワードが入力してログインします。
おわり
To be Continued!!
Discussion