AmazonLinux2にJupyterHubを構築する

2023.02.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

以前EC2上にJupyterLabの環境を構築するといったエントリを書きました。今回久しぶりに同じ様にJupyterLabを構築したのですが、前回と異なりJupyterHubを使ってユーザーごとにワークスペースを作成して分析作業を行える環境を作りましたのでまとめます。

JupyterHubとは

JupyterLabやJupyterNotebookをそのまま構築するとユーザーといった概念はなく共通パスワードで共通の環境へログインして使う事になります。ユーザーごとにそれぞれのワークスペースで分析を行いたいといったJupyterでのマルチユーザー環境を実現するのがJupyterHubになります。

Project Jupyter | JupyterHub

AmazonLinux2にJupyterHubをインストールする

では早速AmazonLinux2にJupyterHubとJupyterLabの環境を構築していきます。

構築環境

  • AmazonLinux2
  • m5.large

ネットワークに関しては特にプライベートにする要件がなかったためパブリックなサブネットにインスタンスを立ててEIPを付与しています。

Swapの追加

はじめにSwapを追加します。今回使うインスタンスタイプではm5.largeなのでメモリは8GBありますが、以前も同じインスタンスタイプで運用していた際にメモリ不足によりしばしばKernelRestartingされてしまったので今回は予めSwapを追加しておきます。

$ sudo dd if=/dev/zero of=/var/swapvaol bs=1M count=16384
$ sudo mkswap /var/swapvaol
$ sudo swapon /var/swapvaol
$ sudo vim /etc/fstab
/var/swapvaol  swap        swap    defaults        0   0

JupyterLab・JupyterHubのインストール

次にJupyterLabとJupyterHubをインストールします。またJupyterHubをリバースプロキシでホストするためにnpmでconfigurable-http-proxyもインストールを行います。

$ sudo yum -y update
$ sudo python3 -m pip install --upgrade pip 
$ sudo python3 -m pip install jupyterhub jupyterlab notebook sudospawner

# npmインストール用
$ sudo yum -y install gcc-c++
$ sudo yum -y install git

# JupyterHubをリバースプロキシでホスト用
$  curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$  sudo yum install -y nodejs
$  sudo npm install -g configurable-http-proxy

これでJupyterLab+JupyterHub環境の構築に必要なモジュールはインストールできました。

ユーザー管理の設定

次に管理ユーザーの作成とユーザー間でファイルを共有できる共有ディレクトリの設定を行います。

# 管理ユーザーの作成
$ sudo useradd jupyter_admin
$ sudo usermod -aG wheel jupyter_admin
## 管理ユーザーのパスワード設定
$ sudo passwd jupyter_admin
## 個人用
$ sudo mkdir /opt/notebooks/jupyter_admin
$ sudo chown jupyter_admin. /opt/notebooks/jupyter_admin/
$ sudo chmod 750 /opt/notebooks/jupyter_admin

# 共有ディレクトリ
$ sudo mkdir /opt/notebooks
$ sudo mkdir /opt/notebooks/shared
$ sudo chown -R jupyter_admin:jupyter /opt/notebooks/

作業内容としては管理ユーザーとしてjupyter_adminを作成してパスワードの設定を行っています。ノートブックは/opt/notebooks配下にユーザー別にディレクトリを作成しその中は各ユーザーのみ書き込み権限をもたせています。共有ディレクトリは/opt/notebooks配下にsharedディレクトリを作成しその場所は誰でも書き込めるようにします。

JupyterHub のコンフィグを作成

次にJupyterHubのコンフィグ設定を行います。設定方法は公式ドキュメント に詳しい設定方法が載っていますので今回は最低限の設定を行います。

$ sudo mkdir ../../opt/jupyterhub
$ sudo vi ../../opt/jupyterhub/jupyterhub_config.py
# Configuration file for jupyterhub.

c = get_config()  #noqa

# SSLは使わない
c.JupyterHub.confirm_no_ssl = True
c.JupyterHub.base_url = '/'

# 管理ユーザーの指定
c.Authenticator.admin_users = {'jupyter_admin'}
# ノートブックディレクトリの指定
c.Spawner.notebook_dir = '/opt/notebooks'
# JupyterLabがベースなので/labで固定
c.Spawner.default_url = '/lab'

# JupyterHubの管理画面でユーザー作成時にLinuxユーザーも作成する
c.LocalAuthenticator.create_system_users=True
# ユーザー作成時に実行するスクリプトを指定
c.LocalAuthenticator.add_user_cmd = ['./add_user.sh']

# Spawnerを指定
c.JupyterHub.spawner_class='sudospawner.SudoSpawner'

# 自動終了設定
c.NotebookApp.shutdown_no_activity_timeout = 30 * 24 * 60 * 60
c.MappingKernelManager.cull_idle_timeout = 3 * 24 * 60 * 60

# ユーザー作成時に実行するスクリプトの作成
$ sudo touch ../../opt/jupyterhub/add_user.sh
$ sudo vi ../../opt/jupyterhub/add_user.sh
#!/bin/bash

username="${1}"

# jupyterグループに所属するユーザーをパスワードを{パスワード}で作成
sudo useradd -p $(perl -e 'print crypt("cryptseed", "{パスワード}")') -d /home/$username -G jupyter $username
# ユーザー用のノートブックディレクトリを作成
sudo mkdir /opt/notebooks/$username
sudo chown $username. /opt/notebooks/$username/
sudo chmod 750 /opt/notebooks/$username

$ sudo chmod 777 ../../opt/jupyterhub/add_user.sh

起動設定

最後にインスタンスを再起動した際にもJupyterLab・JupyterHubを自動起動するようにserviceを作成します。

$ 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.21.1/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

$ sudo systemctl enable jupyterhub.service
$ sudo systemctl start jupyterhub.service
$ sudo systemctl status jupyterhub.service

nodeのバージョンは今回インストールしたバージョンになっていますので、実際には「JupyterLab・JupyterHubのインストール」でインストールしたバージョンを指定するようにします。

以上でJupyterLab・JupyterHubのインストールが完了します。

これでインスタンスのIPを元に`http://{インスタンスIP}/hub/login`にアクセスするとJupyterHubのログイン画面が表示されます。Usernameは「ユーザー管理の設定」で設定した管理ユーザーでアクセスすれば見事ログイン完了です。あとは通常のJupyterLabと同じように必要なモジュールをpipでインストールして分析作業を行うことができます。

まとめ

JupyterHubを使ってユーザーごとにワークスペースを作成して分析作業を行える環境を作ってみました。マルチユーザーでJupyter環境を使う際にはJupyterHubは便利なのでAmazonLinux2にJupyterLab・JupyterHubを構築する際には参考にしてみてください。

最後まで読んで頂いてありがとうございました。