AWS上のubuntu20.04でjupyter-notebookを使ってみた

AWSの学習のために、かなりシンプルなEC２インスタンス(ubuntu20.04)を起動し、
そこでjupyter-notebookサーバーをたててpython3.6の使用を試みた。
AWS上の作業自体はかなりシンプルです。どちらかと言うと、jupyter-notebookの設定用の
記事になっていると思います。

# 環境
###### クライアント
OS: macOS
shhクライアント：openssh
###### AWS
OS:ubuntu:20.04
python3
jupyternotebook


#この記事で行うこと（目次）

[1.Ubuntu AMIでEC2インスタンスの構築](#1-ubuntu-amiでec2インスタンスの構築)
[・ AWSマネジメントコンソールへのログイン](#-awsマネジメントコンソールへのログイン)
[・ VPCの作成](#-vpcの作成)
[・ サブネットの作成](#-サブネットの作成)
[・ インターネットゲートウェイの作成・アタッチ](#-インターネットゲートウェイの作成アタッチ)
[・ セキュリティグループの編集](#-セキュリティグループの編集)
[・ EC2インスタンスの作成](#-ec2インスタンスの作成)
[・ 起動したサーバーへssh接続](#-起動したサーバーへssh接続)

[2.python3のインストールとjupyter環境の構築](#2-python3のインストールとjupyter環境の構築)
[・ 各種インストール(python3、jupyter notebook)](#-各種インストールpython3jupyter-notebook)
[・ jupyter notebookの設定](#-jupyter-notebookの設定)
[・ jupyter notebookを起動](#-jupyter-notebookを起動)

[3.インスタンスの削除](#3-インスタンスの削除)
[4.おわりに](#4-おわりに)


#この記事で行わないこと
* Anacondaのインストール
* AWSアカウントの作成
* ssl証明書の発行
* gitを使用したコードの管理
* GPU対応の機械学習環境構築
など

#本編
ネットワークのざっくりとした構成要素は以下の通り。全て網羅していないので、参考程度にお願いします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/832e7d4f-6edd-6857-89f5-81833c3cdf5b.png)





実際のところ、AWSマネジメントコンソール内のデフォルトのものを使用しても今回の
ネットワークの構築自体は可能ですが、勉強の意味も込めてあえて手を動かして構築する方法をとります。

#1. Ubuntu AMIでEC2インスタンスの構築
#・ AWSマネジメントコンソールへのログイン
ルートユーザではなく、IAMユーザーを作成してログインする。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/ddaca6b4-c460-c40e-9428-e7263ca7cc67.png">

#・ VPCの作成
コンソール画面から、`VPC`と検索→左の一覧から`VPC`を選択→`VPCを作成`へ進むと設定画面
（下画像）に遷移。
VPCの名前や、VPCのIPv4アドレスの範囲を Classless Inter-Domain Routing (CIDR) ブロックの形式で指定。
あとはデフォルトで`VPCの作成`へ進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/f797083e-658f-df02-8fa2-a8ae84e7f3fd.png)
#・サブネットの作成
引き続き左の一覧から`サブネットを作成`を選択→設定画面（下画像）に遷移。
-サブネットを設置するVPC
-サブネット名
-アベイラビリティゾーン
-サブネット内のVPCのIPv4アドレスの範囲
を指定。そのほかはデフォルト。`サブネットを作成`へ進む。

<img width="600" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/10af96d0-2c8d-b1fe-2571-035e707cc18a.png">

#・ インターネットゲートウェイの作成・アタッチ
同様に、左一覧の`インターネットゲートウェイ`を選択→`インターネットゲートウェイの作成`を選択
→名前の指定→`インターネットゲートウェイの作成`へ進む。
画面右上の`VPCへアタッチ`を選択→作成したVPCを選択

・ルートテーブルの設定
作成したVPCにデフォルトでルートテーブルが設定されているが、デフォルトではインターネットに向けたルートが設定されていないので、設定を行う。下画像の`ルートの編集`へ進む。
<img width="800" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/daa0da87-78af-db16-1094-2a07fc372446.png">

`ルートの追加`を選択し、`送信先`に`0.0.0.0/0`、`ターゲット`に作成したインターネットゲートウェイを指定して、`ルートの保存`。
<img width="1000" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/4096fe21-c16b-fd5b-d3ee-1dcb10ec8a1e.png">
#・ セキュリティグループの編集
作成したVPCにデフォルトでセキュリティグループが作成されているが、二つのインバウンドルール
・外部からssh接続を許可するルール
・サーバー内のjupyter-notebookサーバーに、外部から接続するためのルール
を追加する。
画面の下部の`インバウンドルールを編集`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/ee119e40-4624-5408-68e6-e0ecbcfe711f.png)
インバウンドルールとして、画面のように2つのルールを指定する。jupyter-notebookのport番号は`8080`とする。
（画像は8888になってますが、これ以降は8080で進めています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/00aae264-071a-8e8b-b238-bcf52dcef38d.png)

#・ EC2インスタンスの作成
コンソール画面から`EC2`と検索→左一覧から`インスタンス`を選択→`インスタンスを起動`を選択。
AMIは、無料枠の`Ubuntu Server 20.04 LTS (HVM), SSD Volume Type`を選択
インスタンスタイプは、無料枠の`t2.micro`。

インスタンスの詳細の設定では、`ネットワーク`と`サブネット`を自分が作成したVPCとサブネットを指定する。
他はデフォルトを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/b7faabcb-559f-ce4f-1ab7-2932ba225121.png)
ステップ６までデフォルト値を使用。
ステップ６の「セキュリティグループの設定」では、「セキュリティグループの割り当て」で、`既存のセキュリティグループを選択する`にチェック。

ステップ７に進んで「起動」を選択。
キーペアの作成を求められるので、適当な名前をつけてダウンロードして、インスタンスの作成を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/b983dc84-fdbe-47ee-3bab-8970c8d8064a.png)

#・ 起動したサーバーへssh接続
端末を起動して、起動したサーバーにssh接続を行う。
鍵の権限に問題あり（他の人にアクセス権限を与えないで）と言われるので、
`chmod 400 [keyの名前].pem` として所有者のみ読み取り可能にする。
ssh接続のコマンドは以下の通り。
`ssh [-i 鍵のファイル] [ユーザー名]:[パブリックIPv4アドレス]`
ubuntuのEMIを起動したら、デフォルトのユーザーネームは「ubuntu」。

```terminal:macOS
ssh -i ~/Desktop/test-keypair-ubuntu.pem ubuntu@54.238.161.253
```
初めての接続時には、確認を求められるので、「yes」と答える。

#2. python3のインストールとjupyter環境の構築
ここからは、接続先のサーバー（Ubuntu20.04）の中での作業。

まずはアップデート。

```terminal:Ubuntu20.04
sudo apt update
```
#・ 各種インストール(python3、jupyter notebook)

```terminal:Ubuntu20.04
# Python3のインストール
$ sudo apt install python3-pip python3-pandas python3-sklearn

# Jupyter Notebookのインストール
$ sudo apt install jupyter-notebook
```
#・ jupyter notebookの設定
jupyter-notebookの設定ファイルの作成

```terminal:Ubuntu20.04
$ jupyter-notebook --generate-config
Writing default config to: /home/ubuntu/.jupyter/jupyter_notebook_config.py
```
`/home/ubuntu/.jupyter/`に設定ファイルが作成された。
`jupyter_notebook_config.py`を編集する前に、ログイン時のパスワードを設定するための
ハッシュ値を取得する。パスワードを２回入力してハッシュ値を取得。

```terminal:Ubuntu20.04
$ python3 -c "import IPython;print(IPython.lib.passwd())"
Enter password:
Verify password:
sha1:2fc8faf488d0:575967cef992baf593e9cbeeed0e554147e2b88c
```
`sha1:2fc8faf48...`をコピーしておく。

jupyter-ntoebookの設定ファイルの編集

```terminal:Ubuntu20.04
$ vi /home/ubuntu/.jupyter/jupyter_notebook_config.py
```
設定ファイルを編集していく。vimの操作方法はここでは省略する。
デフォルトでは全てコメントアウトしてあるので該当箇所を探しながら設定を変更。

```terminal:jupyter_notebook_config.py
#　ipアドレスの設定
c.NotebookApp.ip = '0.0.0.0' 
#　ブラウザを開くかどうか
c.NotebookApp.open_browser = False
#　portの設定
c.NotebookApp.port = 8080
# さっきコピーしたハッシュ値をペースト
c.NotebookApp.token = u'sha1:2fc8faf488d0:575967cef992baf593e9cbeeed0e554147e2b88c'
```

#・ jupyter notebookを起動

```terminal:Ubuntu20.04
$ jupyter-notebook
```

ブラウザのアドレスバーに`[インスタンスのパブリックIPv4アドレス]：[ポート番号（8080）]`などと入力。
ログイン画面が開くので設定したパスワードを入力

設定ファイルを編集しなくても、jupyter-notebookの起動時にオプションを設定してログイン可能。
`jupyter-notebook --ip=0.0.0.0 --port=8080 --no-browser`
tokenはjupyterサーバー起動時に出力される。

![スクリーンショット 2021-02-03 0.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861723/d41f7e43-477b-84f5-722c-cbc57da4aaef.png)

ホームディレクトリの一覧が表示されれば完了。
numpyやpandas、その他機械学習ライブラリなど、必要に応じてインストールして終了。

#3. インスタンスの削除
今回は無料枠のみで構築しましたが、大掛かりなネットワークを作成した際は、放置しておくと
高額な料金が発生しかねないので、インスタンスの削除または停止をする。
#4. おわりに
今後はより複雑な構造のネットワークを構築や、GPUを使用した機械学習環境の構築
に挑戦したいです。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com