🐍

JupyterHub 環境 を AWS 上に構築しよう

2022/05/29に公開

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を構築します。

構築用terraform

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.shjupyterhub_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