今となってはGoogleのColaboratoryがあるのであまりニーズがないのですが、
EC2でJupyter notebook環境を構築する方法についてまとめておきます。
前提ですが、OSはAmazon Linux 2を利用し、Pythonの仮想環境はpyenvで作ります。
また、ポートはデフォルトの8888番を使用し、アクセスにはパスワードをかけます。
また、作業ディレクトリは/var/notebookとします。
手順1. インスタンスを立てる
Amazon Linux 2 のAMIを選択し、EC2インスタンスを立てます。
このときセキュリティグループではssh接続に使用する22番ポートと、
Jupyter Notebookに接続するポート(デフォルトでは8888番)を開けておきます。
手順2. pyenv必要なモジュールのインストール
pyenv を使うためのモジュールを順番に入れていきます。
最初にyumを最新化し、git、次にpyenvのドキュメントで指定されているモジュール群を入れます。
FIXME: you may need to install xz to build some CPython version
とありますが、xzを入れておかないと新しめのバージョンのpandasをインポートしたときに、
lzma moduleがないと言う旨の警告が出るのでxzも入れておきます。
# yumを最新の状態にする
$ sudo yum update
# gitのインストール
$ sudo yum install git
# 必要なモジュールのインストール
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel
$ sudo yum install sqlite sqlite-devel openssl-devel tk-devel libffi-devel
$ sudo yum install xz xz-devel
手順3. pyenv本体のインストール
ドキュメントの手順にそってインストールします。
リポジトリをcloneし、.bash_profileに設定を入れていきます。
入れたら.bash_profileを再度読み込み、インストールの結果確認としてバージョンを表示します。
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
# .bash_profileを読み込む
$ source .bash_profile
# バージョンの確認
$ pyenv --version
pyenv 1.2.23-75-g80e418ec
手順4. Pythonのインストール
pyenvでインストールできるバージョンを確認し、インストールします。
今回は3.8.8を入れることにしました。
このため、notebookは別途インストールします。
ここで、Anacondaを選ぶと、次のステップのnotebookのインストールを飛ばすことができます。
# インストールできるバージョンの一覧を確認する
$ pyenv install -l
# 3.8.8 をインストールする
$ pyenv install 3.8.8
# 3.8.8 に切り替え
$ pyenv global 3.8.8
$ pyenv rehash
# pythonのバージョンを確認
$ python --version
Python 3.8.8
手順5. Jupyter Notebookのインストール
pipを最新化し、Jupyterをインストールします。
Anacondaを使う場合はこの手順は不要です。
$ pip --version
pip 20.2.3 from /home/ec2-user/.pyenv/versions/3.8.8/lib/python3.8/site-packages/pip (python 3.8)
$ pip install --upgrade pip
$ pip --version
pip 21.0.1 from /home/ec2-user/.pyenv/versions/3.8.8/lib/python3.8/site-packages/pip (python 3.8)
# Jupyter Notebookのインストール
$ pip install notebook
手順6. パスワードトークンの取得
設定ファイルにセットするため、パスワードのハッシュを入手しておきます。
次のコードを実行すると、パスワードを確認含めて2回聞かれますのでそれぞれ入力します。
そして、出力された文字列をどこかに記録しておきます。
昔は sha1:xxxxxxx みたいな文字列でしたが、最近は argon2:xxxxxxx のようです。
アルゴリズムが変わったみたいですね。
$ python -c 'from notebook.auth import passwd;print(passwd())'
Enter password:
Verify password:
argon2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
手順7. 作業ディレクトリ作成
notebookのホームディレクトリとなる作業ディレクトリを作成します。
どこに作ってもいいと思うのですが、自分は/var配下に作るのが好みなので/var/notebookとしています。
本当は専用のユーザーを作った方がいいと思うのですが、自分はそのままec2-userで動かすので、
作ったディレクトリにはec2-userが書き込みができるように権限設定しておきます。
$ cd /var
$ sudo mkdir notebook
$ sudo chown ec2-user:ec2-user notebook
手順8 設定ファイル生成とバックアップ
Jupyter Notebookの設定ファイルを作成し、バックアップをとっておきます。
メッセージに表示されている通り、
/home/ec2-user/.jupyter/jupyter_notebook_config.py
と言うファイルが生成されます。
$ jupyter notebook --generate-config
Writing default config to: /home/ec2-user/.jupyter/jupyter_notebook_config.py
$ cd .jupyter/
$ cp jupyter_notebook_config.py jupyter_notebook_config.py.org
手順9 必要な設定を行う
vimか何かで設定ファイルを開き、必要な設定を施していきます。
vim jupyter_notebook_config.py
必要なのは以下の4行です。
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.notebook_dir = '/var/notebook'
c.NotebookApp.password = 'argon2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
c.NotebookApp.ip の設定は ‘0.0.0.0’ の代わりに ‘*’でも構いません。
デフォルトはlocalhostになっていますが、これにより外部からのアクセスが許可されます。
c.NotebookApp.open_browser = False
は起動時にブラウザを立ち上げない設定です。
c.NotebookApp.notebook_dir はホームディレクトリの設定なので、先ほど作った/var/notebookを設定します。
c.NotebookApp.password
には先ほど保存しておいたパスワードトークンを設定してください。
手順10 起動と接続テスト
これで、準備は整いましたのでnotebookを立ち上げます。
$ jupyter notebook
あとは、
http://{ec2のパブリックIP}:8888
にアクセスすると、Jupyter Notebookのログイン画面が表示されます。
パスワードトークン生成時に入力したパスワードでログインできたら成功です。
この状態だと、ec2インスタンスを起動するたびに、sshで入ってJupyterを起動する必要があり若干手間なので、
次の記事ではインスタンス起動時に自動的にJupyterが立ち上がるように設定する方法を紹介する予定です。