よっしーの私的空間

機械学習を中心に興味のあることについて更新します

AWSでJupyter Notebookサーバを起動してクライアントPC(Windows)からアクセスする方法

AWSUbuntu)でJupyter Notebookを起動して、クライアントPC(Windows)からアクセスする方法について紹介する。

1.環境

AWS

AWSマシンイメージ(AMI):Deep Learning AMI (Ubuntu 18.04) Version 41.0
AMIとは:OSや各種ソフトウェア等を含むスナップショット
(参考:AWS AMI とは - Qiita

インスタンスタイプ:p2.xlarge
有償なので気を付けてください。(2021/3/20現在、0.9USD/時間)
(参考:Amazon EC2 P2 インスタンス| AWS
また、AWSのアカウントを作成したばかりの場合はpインスタンスのvCPU上限値が0のはずなので、おそらく使用できないものと思われます。pインスタンスのvCPU上限値の緩和申請をする必要があります。
(参考:EC2 インスタンス数の制限で起動できない | Oji-Cloud

AWSリージョン:米国東部(バージニア北部)us-east-1 どこでも良いと思いますが、2021/3/20現在においてはPインスタンスを使用する場合は最安値のはずです。 それとpインスタンスが使えないリージョンも多々あるので注意です。

<クライアントPC>

① OS:Windows10 Home

② サーバアクセスツール:Tera Term (インストール先:「Tera Term」定番のターミナルエミュレーター - 窓の杜

2.AWSでEC2インスタンスを作成する

1. インスタンス作成

AWSマネジメントコンソールからEC2サービスにアクセスし、「インスタンスを起動」ボタンを押下。
f:id:t-yoshi-book:20210320161945p:plain

2. AMI選択

AMI選択ページに遷移する。目的は機械学習環境の構築なので、Deep Learning AMIを選択する。

3. インスタンスタイプ選択

p2.xlargeを選択し、「6.セキュリティグループの設定」タブを押下。

4. セキュリティグループの設定

デフォルトだとSSH(ポート22)しかアクセス許可されていないので、カスタムTCPルールとしてポート8888を開けて、クライアントPCのブラウザからJupyter Notebookにアクセスできるようにする。以下は例です。「ソース」を指定していないので、どのIPからでもアクセスできるようになっており、セキュリティ的にはガバガバなので、セキュリティを重視する場合は、必要な設定をお願いします。

f:id:t-yoshi-book:20210320163214p:plain
security group : add port 8888

設定できたら、「確認と作成」ボタンを押下。

5. EC2インスタンス起動

内容を確認して問題がなければ「起動」ボタンを押下する。
SSHアクセスするために、キーペアを作成し、キーペアをダウンロードする(キーペア名を適当に入力して「キーペアのダウンロード」ボタンを押下)。ダウンロードできたら、「インスタンスの作成」ボタンを押下。

f:id:t-yoshi-book:20210320164138p:plain
create key pair and download

3.Tera TermでAWSサーバにアクセスしJupyter Notebookサーバを起動

1. AWSのEC2のインスタンスページからパブリックIPを確認
2. Tera Term起動

ホスト名に上記1で確認したパブリックIPを入力し、「OK」を押下。
f:id:t-yoshi-book:20210320164809p:plain
以下のような画面が表示されるので、ユーザ名は「ubuntu」、「パスワードをメモリ上に記憶する(M)」はチェックをオフに、認証方式は「RSA/DSA/ECDSA/ED25519鍵を使う」を選択し、事前に作成したキーペアを指定し、「OK」を押下。
f:id:t-yoshi-book:20210320165453p:plain

3. 機械学習フレームワーク選択

今回はTensorFlowの最新環境(source activate tensorflow2_latest_p37)を実行する。
使用できる環境は以下の通り、コンソールに一覧として表示されるので、必要な環境をコピーして実行する。
f:id:t-yoshi-book:20210320172219p:plain
Tera Termで以下の通り実行する。

$ source activate tensorflow2_latest_p37
4. Jupyter Notebookのセキュリティ設定

AWS公式の通りですが、以下にまとめます。
まずはJupyter Notebookアクセス時に使用するパスワードを指定する。以下コマンドを実行。

$ jupyter notebook password

以下のように出力されるので、出力内容に従ってパスワードを指定する。

Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /home/ubuntu/.jupyter/jupyter_notebook_config.json

続いて自己署名SSL証明書を発行します。以下の通り実行

$ cd ~
$ mkdir ssl
$ cd ssl
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

証明書発行にあたってサーバ情報を要求されるので、適当に入力。良く分からないですが、空白にするとJupyternotebookを起動したときにうまくいかない気がします。

Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]: Minato
Organization Name (eg, company) [Default Company Ltd]: NNN
Organizational Unit Name (eg, section) []: NNN
Common Name (eg, your name or your server's hostname) []: NNN
Email Address []: test@gmail.com
5. Jupyter Notebookのコンフィグファイル設定

以下を実行して、コンフィグファイルを開きます。エディタはなんでもOKですが、今回はnanoを使用しています。

$ nano ~/.jupyter/jupyter_notebook_config.py

コンフィグファイルが開くので以下の通り編集する。

c.NotebookApp.ip = '*' #アクセス元のIPとして全IPを許可
c.NotebookApp.open_browser = False #ubuntuサーバでJupyter Notebookを起動した際にブラウザを起動しないようにする
c.NotebookApp.port = 8888 #ポート指定

nanoの操作方法も簡単に説明。
 F6キー:文字検索
 Ctrl + X:nanoの終了

6. Jupyter Notebook起動

以下を実行して、Jupyter Notebookを起動する。

$ jupyter notebook --certfile=~/ssl/mycert.pem --keyfile ~/ssl/mykey.key

無事起動できたら以下のように出力される。
f:id:t-yoshi-book:20210320181120p:plain

4.クライアントPCからJupyer Notebookにアクセス

ブラウザで以下の通りアクセス

https://<AWSのパブリックIP>:8888

パスワードを求められるので、事前に設定したパスワードを入力してログイン。