Moodle + JupyterHub 連携システム シリーズ(5)
5. Moodle と JupyterHub の連携
5.1 JupyterHub の設定
「3. JupyterHub (LTIContainerSpawner) のインストールと設定」 により,現在 JupyterHub はテストモードで起動しています.これを,Moodle との連携モードに切り替えます.
本システムの基本設定は /usr/local/etc/ltictr/jupyterhub_lticontainer_config.py の内容を書き換えることによって行われます.
5.1.1 jupyterhub_lticontainer_config.py の設定
ltiauth_consumer_key, ltiauth_secret_key
まず,LTI のコンシューマキーと共有シークレット を設定します.キーの値は openssl コマンドで生成します.
下記コマンドを2回実行し,出力された16進数の文字列をそれぞれ ltiauth_consumer_key, ltiauth_secret_key に設定します.
openssl rand -hex 32 # 32 バイトの乱数を生成し,64 文字の 16 進表現として出力
- 設定例
ltiauth_consumer_key = 'b18e82ec683724743236fade71350720029a29144a585c66f6741d8e9c6e0d83'
ltiauth_secret_key = 'c0fe2924dbb0f4701d898d36aaf9fd89c7a3ed3a7db6f0003d0e825a7eccb41c'
c.JupyterHub.authenticator_class
認証モジュールの指定(c.JupyterHub.authenticator_class)を PAM から LTI に変更します.
具体的には下記の様に,jupyterhub.auth.PAMAuthenticator(PAM) を指定している行をコメントアウトし,ltiauthenticator.LTIAuthenticator(LTI)を指定している行をアンコメントします.
## for TEST
#c.JupyterHub.authenticator_class = 'jupyterhub.auth.PAMAuthenticator' # コメントアウトする
## for LTI
c.JupyterHub.authenticator_class = 'ltiauthenticator.LTIAuthenticator' # アンコメントする
api_token
mod_lticontainer の設定で,「JupyterHub API Token」 (4.3.1 「Settings of Container and LTI」内の設定)に 設定した文字列と同じものを設定 します.8文字以上の英数字であれば,内容に特別な制限はありません.
例)ABCDEFGH
5.2 Moodle の外部ツールの作成
Moodle から JupyterHub への接続ポイントとなる 外部ツール を作成します.
Moodle に管理者としてログインし,「サイト管理」のメニューから以下のように辿って,「ツールを管理する」 を表示させます.
「サイト管理」→「プラグイン」→「活動モジュール」ブロックの「外部ツール」→「ツールを管理する」
ここで,「ツールを手動設定する」 をクリックすると,外部ツール を作成できます.設定する箇所は 「ツール設定」 および 「プライバシー」 です.
5.2.1 ツール設定
ツール名
ツールの名前を指定します.特に制限はありません.
ツールURL
https://JupyterHubサーバ名:ポート番号/hub/lti/launch の形で指定します.ポート番号が 443 の場合は :ポート番号 は省略できます.
URLの後ろの方に /hub/lti/launch を必ずつけてください.
例)https://aldebaran.nsl.tuis.ac.jp/hub/lti/launch
LTIバージョン
LTI のバージョンを指定します.現時点では LTI 1.3 はサポートしていないので,必ず初期値の LTI 1.0/1.1 を選択します.
コンシューマキー
「5.1.1 jupyterhub_lticontainer_config.py の設定」 で設定した, JupyterHub の設定ファイル jupyterhub_lticontainer_config.py の ltiauth_consumer_key の値をここにコピーします(シングルクォーテーションは外します).
共有シークレット
「5.1.1 jupyterhub_lticontainer_config.py の設定」 で設定した, JupyterHub の設定ファイル jupyterhub_lticontainer_config.py の ltiauth_secret_key の値をここにコピーします(シングルクォーテーションは外します).
カスタムパラメータ
空欄のままにします.
ツール設定使用
「活動チューザまたは事前設定ツールに表示する」 を選択します.
ここが正しく設定されていない場合,外部ツールを配置する際に 「活動またはリソースを追加する」 画面に該当の外部ツールが表示されません.
デフォルト起動コンテナ
「新しいウィンドウ」 を選択します.
5.2.2 プライバシー
ランチャ名をツールと共有する
「常に」 にします.
5.2.3 外部ツール
外部ツール の作成に成功した場合,「ツールを管理する」 ページに下記のような表示が現れます.
5.3 ユーザ情報の共通化(共有)
Moodle から JupyterHub へ LTI を用いて SSO する場合,Moodle 上のユーザと JupyterHub サーバ上のユーザを同一人物として扱えるようにしておく必要があります.
ここで注意すべき点は,「Moodle サーバのユーザ」ではなく,Moodle にログインしているユーザ(LMS 上のユーザ) とJupyterHub サーバ上の Linux ユーザ の対応付けである,という点です.
5.3.1 ユーザ情報が共通化されていない場合の挙動
JupyterHub 側で該当する Linux ユーザが存在しない場合,JupyterHub はその利用者を 仮のユーザ として扱います.
この場合,
- ユーザ名は Moodle から通知されたものが使用されますが,実ユーザが存在しないため仮ユーザとして扱われ,UID は自動割り当てとなります(デフォルトでは 30000 番台)※1
- 所属グループは others になります(others が存在しない場合,GID は 30000 になります)
- ホームディレクトリは /home/others/ 以下に自動的に作成されます
といった挙動になります.
※1:本システムのデフォルト設定では,UID は Moodle のユーザ番号に 30000 を加算した値になります.
この状態でも JupyterHub 自体は利用可能ですが,
- Moodle 上の成績管理
- ユーザ単位でのログ・提出物の対応付け
を行う場合には不都合が生じます.そのため,ユーザ情報の共通化を行うことを強く推奨します.
5.3.2 標準的な方法:LDAP による共通化
最も一般的な方法は,Moodle と JupyterHub サーバが同一の LDAP ディレクトリを参照する構成です.
この方法は多くの事例があり,既存の認証基盤を利用できる場合には有効ですが,本記事では LDAP の詳細な設定については扱いません.
5.3.3 代替案:NSS を用いたユーザ情報の共有(altfiles)
LDAP を使用しない方法として,Linux の NSS(Name Service Switch) の仕組みを利用する方法があります.
JupyterHub は内部的に Linux のユーザ情報を NSS 経由で取得しており,そのため getent passwd および getent group で情報が取得できる構成であれば動作します.つまり,/etc/passwd に直接ユーザを追加する必要はありません.
そこで,/etc/passwd や /etc/group とは別に 追加のユーザ情報ファイルを用意し,NSS 経由でそれらを結合して見せる という構成を取ります.この用途に適しているのが nss-altfiles です.
nss-altfiles の概要
- 外部の passwd / group ファイルを NSS に組み込める
-
/etc/passwdを直接編集する必要がない -
getent passwd/getent groupで情報が取得できれば OK - 教育機関では年度更新が必要だが,LDAP より設定が簡単な場合が多い
nss-altfiles のインストール例
git clone https://github.com/aperezdc/nss-altfiles.git
cd nss-altfiles/
git checkout 20fb62c61aad40c311c2c43ea2f7bd051015ca52 # ※2
./configure --prefix=/usr --datadir=/usr/local/etc --with-types=pwd,grp # ※3
make
make install
ln -s /usr/lib/libnss_altfiles.so.2 /usr/lib64/libnss_altfiles.so
ldconfig
※2(重要)
最新版の nss-altfiles には,./configure の --datadir オプションが正しく反映されず,任意のディレクトリを指定できない 不具合があります.
そのため,本記事では --datadir が正しく機能することを確認済みのコミットにチェックアウトしてからビルドしています.
※3(設定内容)
外部の passwd / group ファイルを配置するディレクトリは,./configure の --datadir オプションで指定します.本記事の例では /usr/local/etc を使用しています.
NSS の設定
/etc/nsswitch.conf の passwd と group の参照設定について,files の後に altfiles を挿入します.
passwd: sss files altfiles systemd
group: sss files altfiles systemd
これにより,/etc/passwd と 外部の passwd / group ファイル (/usr/local/etc/passwd, /usr/local/etc/group)が結合され,システムからは一体のユーザ情報として参照されます.
5.4 Moodle + JupyterHub 連携のテスト
5.4.1 外部ツールの配置
ここまでで,Moodle と JupyterHub の設定は終了しているはずですので,次に 5.2 で作成した 外部ツールのインスタンスを Moodle のトピックに配置します.
場所はどのトピックでも問題ありません.モジュールのインスタンスの追加と同様に 「活動またはリソースを追加する」 の画面から,5.2 で作成した外部ツール(パズルのピース形のアイコン)を選択して追加します.追加の際には,インスタンスの名前を指定する必要があります(後で修正可能).
外部ツールのインスタンスは複数個追加することができます.既に配置済みのインスタンスを複製しても問題はありません.この場合,一個のインスタンスを一つの課題に割り当てることができます.どのように割り当てるかは,mod_lticontainer のインスタンスで指定しますので,取りあえず何個か複製しておいても大丈夫です.
5.4.2 個々の外部ツールの設定
外部ツールの配置が終わったら,mod_lticontainer のインスタンスを起動します.mod_lticontainer の画面になったら,「LTI Connections」 のタブをクリックします.
mod_lticontainer は自分が使用している JupyterHub サーバを,同様に利用している外部ツールを自動的に検索し,「LTI Connections」にリストアップします.外部ツールの名前をクリックすると,その外部ツールの設定画面が表示されます.
細かい設定は次章(第6章)に譲ることにして,Command の上から 3番目の Container Image だけ設定します.プルダウンメニューから ghcr.io/jupyter-fumihax/jupyterhub-ltictr.singleuser : latest を選択します.
もし,プルダウンメニュー に何も表示されていない場合は,JupyterHub との通信が上手く行っていません.「9.トラブルシューティング」 を参照してください.
Container Image が選択出来たら,「更新」ボタンをクリックします.これで設定は終了ですので,タブメニューの一番右にある 「Return to course」 をクリックして,コース画面に戻ります.
5.4.3 JupyterHub への接続テスト
コース画面に戻ったら,設定した外部ツールの名前部分をクリックします.「Start My Server」 と書かれた青いボタンが表示されますので,それをクリックします.
正常に動作すれば プログレスバーが表示され,少し待つと JupyterLab の画面が表示されます.JupyterLab の画面が表示されれば,接続テストは成功したと言うことです.
途中でプログレスバーが止まってしまった場合は,これまでの設定を見直してください.また,「9.トラブルシューティング」 に参考となる情報が有るかもしれません.
なお,JupyterHub にユーザ情報があるアカウントで JupyterHub に接続した場合は,JupyterHub 上に /home/グループ名/ユーザ名 のディレクトリが(もし存在しなければ)自動的に作成されます.
Moodle の 管理ユーザ(admin)で接続した場合は,JupyterHub に admin というユーザが存在しなければ,/home/othsers/admin と言うディレクトリが自動的に作成されます.
シリーズ「LTI カスタムパラメータによる Moodle+JupyterHub 連携システムの構築と運用」第5回
第1回に戻る | 前へ:JupyterHub(LTIContainerSpawner)のインストールと設定 | 次へ:運用方法 (構築中!)





