はじめに
自宅のPCがメモリ8GiBしかないため、32GiB環境を手に入れたいと思い、AWS上にLinuxインスタンスを立てようと思います。Linux上でjupyter notebookを起動し、リモートでブラウザからアクセスしてjupyterを使用します。
環境
- AWSアカウントは持っている前提とします
手順
AWSインスタンス作成
サービスからEC2を選択し、インスタンスを作成します。
作成するインスタンスは下記のとおりです。
サーバへの接続
sshクライアントはTeratermを使用しました。インストール方法と接続方法はこちらの手順通りに行いました。
ログイン後、rootユーザに切り替えます。以降の操作は管理者として実行します。
$ sudo su -
AWSの初期設定では、sshが鍵を使用した認証になっています。複数のクライアントからアクセスする場合は鍵を配布するのが大変なので、パスワード認証のほうが楽だと思います。
パスワード認証への変更の仕方はこちらの手順で実施しました。
タイムゾーンを日本に設定します。設定の仕方はこちらの手順で実施しました。
Anacondaのインストール
Anacondaのインストール方法はこちらを参考にしました。
自宅PCでAnacondaのサイトから64-Bit (x86) Installer (652.5 MB)をダウンロードします。構築時はPython 3.7 versionでした。
WinSCPを用いて、作成したLinuxインスタンスにインストーラを移動します。
WinSCPのインストールはこちらが参考になります。
WinSCPの鍵認証でAWSインスタンスにアクセスするにはこちらが参考になります。
インスタンスかに直接ダウンロードもできます。wgetをインストールします。
$ yum install wget
サイトからanacondaをダウンロードします。
$ wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh
こちらを参考にしました。
下記コマンドを実行し、インストールします。途中でインストールのパスが聞かれます。今回は/root/anaconda3/としました。
$ sh Anaconda3-2018.12-Linux-x86_64.sh
Anacondaインストール過程で、zipを解凍できない時があります。そのときはbunzip2をインストールします。
$ yum install bzip2
インストール後は下記コマンドでパスを通しました。
$ export PATH=/root/anaconda3/bin:$PATH
ここで、/root/anaconda3の部分はインストール先のパスです。
仮想環境作成
下記コマンドで仮想環境を作成します。
conda create -n py37 python=3.7.1 anaconda
anacondaオプションでパッケージ全部入りのpython環境をつくれます。
仮想環境についてはこちらが参考になります。
jupyter notebook設定
notebookやデータを保管するディレクトリを作成します。
$ cd ~ # rootで操作しているので/rootに移動します
$ mkdir work
仮想環境をアクティブ化します。
$ source activate py37
jupyterの設定を行います。こちらを参考にしました。
jupyterのログインパスワードを設定します。
$ ipython
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[3]: 'sha1:...' # 暗号化された文字列をコピーしておく
最後に表示された’sha1:…’の部分を控えておきます。
次にサーバに設定する鍵を生成します。
$ cd ~ # rootで操作しているので/rootに移動します
$ mkdir .jupyter
$ cd .jupyter
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
jupyter notebookのコンフィグを設定します。
$ vi /root/.jupyter/jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip='0.0.0.0' # 任意のipアドレスからアクセス可
c.NotebookApp.password = 'sha1:...' # コピーしておいた文字列
c.NotebookApp.open_browser=False # jupyter起動時にブラウザはを自動で開かない
c.NotebookApp.port=適当なポート番号 # サーバーのportで今回は8888
c.NotebookApp.certfile = u'/root/.jupyter/mycert.pem' # サーバ証明書
c.NotebookApp.keyfile = u'/root/.jupyter/mykey.key' # 秘密鍵
c.NotebookApp.notebook_dir = '/root/work' # jupyterのWebUIから見えるファイル構造のルート
下記コマンドでjupyterを起動します。
$ jupyter notebook --ip='0.0.0.0' --allow-root &
自宅のPCのブラウザでサーバにhttps://サーバのip:8888にアクセスすると、パスワード入力を求められるので、ログインします。
jupyterを止めるときは下記コマンドでプロセスIDを探し、
$ ps aux | grep jupyter
killコマンドでプロセスを終了します。
$ kill ここにプロセスID
jupyter自動起動
上記の設定だとサーバを起動するたびにjupyterを手動で起動する必要があります。そこでサーバ起動と同時に自動でjupyterが起動するようにします。
こちらを参考にしました。
起動スクリプトを作成します。
$ touch ~/start_jupyter.sh
起動スクリプトを編集します。
$ vi ~/start_jupyter.sh
/root/anaconda3/envs/py37/bin/jupyter notebook --ip='0.0.0.0' --allow-root &
ファイルの権限を変更します。
$ chmod 755 start_jupyter.sh
rc.localに実行コマンドを追加します。(このやり方はCentOS7では古いのでサービス化した方が良いです。)
$ vi /etc/rc.d/rc.local
sudo sh '/root/start_jupyter.sh'
CentOS7以降だと起動しない場合があります(参考)。実行権限を付与します。
$ chmod u+x /etc/rc.d/rc.local
root権限でshutdown -r nowでEC2を再起動します。
ブラウザでサーバにアクセスし、jupyterのlogin画面が出たら成功です。
AMIからサーバを再作成
ここまでサーバを構築出来たら、サーバのイメージを作成します。そして作成されたAMIを元に好きなスペックでサーバを立て直します。私はC5.4xlargeインスタンス(メモリ32GiB、ストレージ100GiB)で作成しなおしました。1時間約80円です。まあまあします。
おまけ
データの移動などのために、ec2-userのディレクトリの権限を開放しておくと便利だと思い、chmod 777 ec2-userをしたら、外部からsshで接続できなくなりました。
次のコマンドで元に戻りました。
$ chmod 755 ec2-user
おわりに
AWSにjupyterを構築しました。噂ではGCPのほうがコストが安くなるとかで、そちらも試してみたいです。