この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
JupyterHubを利用すると、JupyterNotebook環境にログイン機能が追加され、マルチユーザーで利用できるようになります。 今回はJupyterHubの oauthenticator を使ってSSOを実装してみます。oauthenticatorを利用することでGitHub、Google、GitLabなどと連携できるようになります。
ということで、検証してみました。
構成イメージ
今回試してみたのはこんな構成です。JupyterHubへログインすると、AWS上のGitLabにリダイレクトしSSO連携します。
- ローカル環境
- Docker for Mac(kubernetes)
- Helmを使いJupyterHubをインストール
- AWS環境
- ACMを使いELBのリスナーをHTTPSで設定
- EC2上にDockerをインストールし、GitLabを立ち上げる
はじめはGitLabもローカル環境で試していたのですが、認証連携時にJypyterHubで500エラーが出ました。なんでかなーって、色々調査したのですが、OAUTH2連携にはTLSが必要のようで、その影響でエラーになっているようでした。そのため、GitLabはAWS上にたて、ELBを使ってTLS終端しています。
やってみた
AWS環境
EC2とロードバランサー の設定
まずは、EC2を立ち上げます。
ログインし、DockerのインストールとGitLabの起動を行いましょう。
$ sudo yum install docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 1022:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
ELBのターゲットグループを作成します。別途EC2の80ポートを解放しておきましょう。
ELBを作成しましょう。Application Load Balancerを指定し、セキュリティグループは443を許可します。
ACMを発行し、ロドバランサーのリスナーを443に設定します。
作成したロードバランサーにDNSの設定もしておきましょう。今回はRoute53を使っています。
EC2とロードバランサーの設定は以上です。
GitLabの設定
GitLabへログインし、アプリケーションの設定をします。アプリケーションIDとシークレットIDを取得します。
左上のユーザーのアイコン > Settings > Application から設定します。
スコープは api
と read_user
を有効化します。
また、コールバックURLは http(s)://jupyterhub-domain/hub/oauth_callback
を指定します。
発行されたApplication ID
と Secret
は控えておきましょう。
ローカル環境
JupyterHub環境
ローカル環境には、JupyterHubを展開します。 セットアップはこちらを参考に。
事前にDocker for Macの設定からKubernetesを有効にしておきましょう。
Helmでデプロイするときに指定するconfig.yml
は、こんな感じで設定します。GitLab認証を有効化するための設定を入れています。取得したApplication ID
と Secret
を入力しましょう。GITLAB_HOST
にはGitLabのURLを指定します。(因みにGITLAB_HOSTの行を削除すると、パブリックのGitLabに連携されるようになります)
proxy:
secretToken: "xxx"
singleuser:
defaultUrl: "/lab"
hub:
extraConfig:
jupyterlab: |
c.Spawner.cmd = ['jupyter-labhub']
extraConfig: |
from oauthenticator.gitlab import GitLabOAuthenticator
c.JupyterHub.authenticator_class = GitLabOAuthenticator
extraEnv:
GITLAB_HOST: "https://gitlab.example.com/"
OAUTH_CALLBACK_URL: "http://localhost/hub/oauth_callback"
OAUTH_CLIENT_ID: "Application ID"
OAUTH_CLIENT_SECRET: "Secret"
ログインしてみる
では、JupyterHubへ接続してGitLabのアカウントでログインできるか試してみましょう。 アクセスすると、GitLabログインのためのリンクが表示されます。クリックしましょう。
AWS上に展開したGitLabのログイン画面になりました。ユーザー、パスワードを入力しログインしてみます。
初回だけ許可確認されるので Authorize
をクリックします。
ログインできました!
さいごに
あまりドキュメントがなく、はまりましたがSSOできるようになりました。特にGitLabをTLS接続していなかったため、ログイン時に500エラーが返されてました。OAUTH2にはTLS必要という認識がなかったので、とても勉強になりました。それではまた。