AWSによるEC2インスタンスの作成

AWSのEC2インスタンスを使うためのやり方のメモです。

# 行ったこと
[PyTorchによる発展ディープラーニング](https://book.mynavi.jp/ec/products/detail/id=104855)を参考に、AWSのEC2インスタンスを使えるようにした際の手順をまとめました。
1.  AWSのアカウント作成
2.  EC2インスタンスの作成
3.  SSHでの接続

### 環境

```souece:OS
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
```

# 1.  AWSのアカウント作成
[AWSアカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)の流れにそって作成しました。
個人的には、音声による認識などが面白かったです。英語だったので少し緊張しました。

# 2.  EC2インスタンスの作成
[PyTorchによる発展ディープラーニング](https://book.mynavi.jp/ec/products/detail/id=104855)と[AWS EC2インスタンスを作成する](https://www.ritolab.com/entry/17)を参考にしながらEC2インスタンスを作成しました。

途中以下のように「割当られているvCPUが足りずに作成できません」で作成に失敗したので、対処した内容も追記しました。

```souece:ERROR
You have requested more vCPU capacity than your current vCPU limit of 0 allows for the instance 
bucket that the specified instance type belongs to. 
Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit.
```
### 2.1 AWS マネージメントコンソールにログイン 
[AWSのトップページ](https://aws.amazon.com/jp/)の右上にあるアカウントからマネージメントコンソールを選択すると、サインインのページに飛びます。ここで、ルートユーザを選択し、先ほど作成したアカウントのE-mailアドレスを入力してログインします。
![management_console.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/6134665e-13f8-159d-c826-d6ec3dfd8e92.jpeg)

ここで、どの地域(リージョン)に設置されているマシンを使用するのかの選択ができます。リージョンごとにサービスの値段はかなり違うそうです。後のステップで選択することになりますが、インスタンスタイプが決まっている場合には、そのタイプの値段が安いリージョンを選択するとよいと思います。
リージョンごとの値段一覧が表示されるページはみつからなかったのですが、[ここのページ](https://aws.amazon.com/jp/ec2/pricing/on-demand/)でリージョンを選択すると、インスタンスタイプごとの値段が見られます。私はp2.xlargeというGPUインスタンスを使いたかったのでp2.xlargeの値段を調べてみました。そもそもp2.xlargeが選択できないリージョンがたくさんありました。また、東京は割高と言われていましたが、他のアジア地域の方が割高でした。目的に応じたリージョンの選択は大切だと思いました。

| エリア |リージョン  |値段 USD/hour  |
|---|---|---|
|米国 |オハイオ  |0.9  |
|    |バージニア  |0.9  |
|アジア|ムンバイ  |1.718  |
|    | ソウル | 1.465 |
|    | シンガポール | 1.718 |
|    | シドニー | 1.542 |
|    | 東京 | 1.542 |
| 欧州 |フランクフルト  | 1.326 |
|    | アイルランド | 0.972 |
| AWS GovCloud   | 米国西部 | 1.08 |


### 2.2 EC2インスタンスの作成 
ログインしたら、左上にあるサービスメニューをクリックしてAWSサービス一覧を表示し、左上のコンピューティングの最初にあるEC2をクリックしてEC2ダッシュボード画面を開きます。
![EC2_dashbord.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/8dfe1587-a0dc-5771-3d5d-e830bb7f389b.jpeg)


画面中央少し下に「インスタンスの起動」というオレンジ色のボタンがあるので、そのボタンをクリックしてインスタンスの作成を開始します。
![instart_start.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/2f12fa6e-9f90-5a91-50e7-23b3dd76b972.jpeg)

### 2.3 アマゾンマシンイメージ(AMI)の選択
 次にインスタンスの選択を行います。私はDeepLearning用のインスタンスとして参考資料1で紹介されているDeepLearningAMIを選択するために、検索欄にubuntu deeplearning と入力しました。Ubuntuのバージョンが18.04と16.04の２種類、またAWS Deep　Learning AMIと Deep Learning Base AMIというものがヒットしましたが、AWS Deep Learning AMI(Ubuntu 18.04)の選択ボタンを押し、確認画面でContinueボタンを押します。
![ami_selection.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/23ba1a38-0ff1-8df8-b12d-9c51e752d455.jpeg)

### 2.4 インスタンスタイプの選択
　次にインスタンスタイプの選択を行います。私はp2.xlargeというインスタンスタイプを選択しました。目的のインスタンスタイプを選択して、左の四角をチェックして選択した後、右下の「次の手順：インスタンスの詳細の設定」ボタンを押します。
![instanse_type.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/4f3e8c9d-c210-6722-4f08-4a356a0b96e2.jpeg)

### 2.5 インスタンスタイプの選択
こちらは特に初期設定を変更せず、そのまま「次の手順：ストレージの追加」に進みました。モニタリングにチェックを入れたり、テナンシーを変更して共有以外にすると、追加料金が発生するそうです。

### 2.6 ストレージの追加
参考資料１に従い、ボリュームタイプを「汎用SSD」、サイズを200GiBに設定しました。
![instance_storage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/44394ed0-0307-83d2-fef8-c2d33a88c11b.jpeg)
参考資料3によると、無料使用期間を過ぎると、ここで設定したストレージに応じて課金されるそうなので、注意が必要です。
そして「次の手順：タグの追加」に進みます。

### 2.7 タグの追加
タグの作成は特に行う必要はありません。私は最初はタグはつけずに先に進みました。右下の「次の手順：セキュリティグループの設定」ボタンを押します。
![instance_tag.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/c92b6127-1cce-3feb-0e26-cdf2be6346bb.jpeg)

後になってインスタンスにタグをつけることも可能です。すでにあるインスタンスにタグを追加するには、EC2-インスタンスを選択します。するとインスタンス概要の下に、インスタンスの詳細が示されている画面になります。そこで、詳細からタグのタブを選択し、右端の「タグを管理」ボタンを押します。
![instance_tag_add.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/d31adf85-d607-f7e1-9cfb-f79ec18ef85f.jpeg)

ここでキーと値を設定して保存ボタンを押せば、タグが設定できます。

### 2.8 セキュリティグループの設定
こちらも、最初は何も設定せずに進んでしまったのですが、後になって参考資料３と同様の設定を行いました。
その方法は、2.1.7と同様にインスタンスを選択した後、「セキュリティ」タブを選択します。セキュリティの詳細に示されるセキュリティグループ名をクリックし、インバウンドルール　タブ内の右端にある「インバウンドルールを編集」ボタンをクリックして、ルールの追加により必要なルールを追加していきます。

### 2.9 インスタンスの作成
設定した内容を確認して、右下の「起動」ボタンを押します。
すると、キーペアの選択・作成画面が表示されます。「新しいキーペアの作成」を選択して、キーペアの名前(例えば "keypair_name")を入力して「キーペアのダウンロード」ボタンを押すと、keypair_name.pemというファイルが作成され、ダウンロード先に保存されます。そして、EC2インスタンスの作成が開始されます。

作成ステータスという画面となり、インスタンスは現在作成中ですと表示され、順調に作成が開始されたと思ったのですが、最初に書いたように、vCPUた足りませんというエラーメッセージと共にインスタンスが作成の失敗が表示されました。

```souece:ERROR
You have requested more vCPU capacity than your current vCPU limit of 0 allows for the instance bucket that the specified instance type belongs to. 
Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit.
```
インストラクションにそってすすめたつもりだったので、何故失敗するのかわからなかったのですが、どうやらp2.xlargeを作成するためのvCPUが足りないようです。エラーメッセージに示されるURL http://aws.amazon.com/contact-us/ec2-request にアクセスると、選択しているリージョン(私の場合はオハイオ)にリソースを要求できるようですが、プライマリインスタンスタイプに何を選択するべきなのかよくわかりませんでした。
![resource_request.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/157c3709-1e54-68e7-40e6-2e26278af742.jpeg)

AWSのトップページの左上にあるサービス-EC2を選択し、左に現れるEC2ダッシュボードの「制限」を選択すると、アカウントに割り当てられているものが表示されます。インスタンスタイプがp2.xlargeなので、プライマリインスタンスタイプをAll P instancesに、New limit valueを4としましたが、間違ったリソース要求をしてうまく行かないと困るので、Case DescriptionのUse case description という自由記入欄のような所があったので、そこに p2.xlargeを作りたいのですが、必要なリソースをくださいと正直に書きました。以下が稚拙な英語で書いたリクエストになります。

```souece:
Dear support person,
I have just started to use AWS by following a textbook.
When I tried to make my first instance of p2.xlarge, I got the following error.
"You have requested more vCPU capacity than your current vCPU limit of 0 allows for the instance 
bucket that the specified instance type belongs to. 
Please visit http://aws.amazon.com/contact-us/ec2-request  to request an adjustment to this limit."
I checked my limitation which said I have 64vCPU of All Standard (A, C, D, H, I, M, R, ..., 
but 0vCPU for all other spot instances.　Though I selected All P instances and 4 for new limit value, 
I'm not sure which type of vCPU I should request to make the p2.xlarge instance.
Could you please adjust to the limit so that I can make the p2.xlarge instance, 
which my textbook tells me to make.
Thanks.
```
するとすぐに返事がきて、無事リソースを増やしていただき、p2.xlargeを作成することができました。
返事は日本語できたので、最初から日本語でリクエストしてもよかったのかもしれません。なんとなくオハイオリージョンにリクエストするなら英語で書かなくてはいけないと思い込み、英語で書きました。

### 2.10 インスタンスの停止
vCPUを増やしてもらった後、無事にインスタンスを作成することができました。作成したインスタンスの起動と停止についてです。
インスタンスの状態は [Amazon EC2コンソール](https://console.aws.amazon.com/ec2/)の左側にあるナビゲータから、インスタンスを選択することで確認することができます。
対応するインスタンスIDのインスタンスの状態が「実行中」となっている状態は立ち上がっている状態で、料金が発生していますので、使用しない時には停止中にします。やり方は、対応するインスタンスの左端にあるチェックボックスをチェックした後、右上にあるインスタンスの状態の横の▼をクリックして、「インスタンスを停止」を選択します。対応するインスタンスのインスタンスの状態が「停止済み」に変われば、インスタンスが停止されたことになります。
![instance_stop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616171/3bd82813-ac54-62eb-e062-2c8937950746.jpeg)

# 3.  SSHによる接続
[PyTorchによる発展ディープラーニング](https://book.mynavi.jp/ec/products/detail/id=104855)では、WindowsからAWSのインスタンスにアクセスする方法として、TeraTermを用いた方法が紹介されていましたが、私の環境は Ubuntu16.04なので、そこからの接続について書きます。

### 3.1 インスタンスの開始
2.1で停止したインスタンスを再度立ち上げます。やり方は2.1と同様、[Amazon EC2コンソール](https://console.aws.amazon.com/ec2/)の左側にあるナビゲータから、インスタンスし、対応するインスタンスを選択します。そして、右上の「インスタンスの状態」の横の▼をクリックして、「インスタンスを開始」を選択します。
インスタンスの状態が「実行中」に変わると、右側のパブリックIPにインスタンスのIPアドレスが表示されます。こちらのアドレス<IPaddress>を使って、アクセスします。

今回はインスタンスの中からJupyter notebookを用いるために、sshポート転送 を行う必要があります。そのため、以下のようにしてインスタンスにアクセスします。ここで、keypair_name.pemは2.9で作成したキーペアファイルになります。(カレントディレクトリ下にkeypair_name.pemが存在する前提で書いています。）

```souece:
$chmod 400 keypair_name.pem
$ssh -i "keypair_name.pem" -L 9999:localhost:9999 ubuntu@<IPaddress>
```
```souece:
The authenticity of host '<IPaddress>' can't be established.
ECDSA key fingerprint is SHA***
Are you sure you want to continue connecting (yes/no)? 
```
というメッセージが表示されるので、yesとタイプすると、インスタンスにログインできます。
次にインスタンスの中でanacondaの仮想環境に入り、そこからjupyter notebookを起動します。

```souece:
ubuntu@ip-***:~$source activate pytorch_p36
(pytorch_p36) ubuntu@ip-***:~$ jupyter notebook --port 9999
```
```souece:
To access the notebook, open this file in a browser:
    file:///home/ubuntu/.local/...
Or copy and paste one of these URLs:
    http://localhost:9999/?token=<***>
 or http://127.0.0.1:9999/?token=<***>
```
というメッセージが表示されるので、http://localhost:9999/?token=<***> の部分をコピーしてブラウザのURLに貼ると、ブラウザからjupyter notebookが立ち上がります。

使用後は、jupyter notebook をctrl-Cで終了した後、anacondaの仮想環境からはconda deactivateで抜け、$exitでインスタンスへのssh接続を終了します。最後に2.10に従い、インスタンスを停止するのを忘れないように注意しましょう。


# 4. 参考資料
以下を参考にさせていただきました。
1. [PyTorchによる発展ディープラーニング](https://book.mynavi.jp/ec/products/detail/id=104855)
2. [AWSアカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)
3. [AWS EC2インスタンスを作成する](https://www.ritolab.com/entry/17)
4. [MacからEC2上のJupyter Notebookにポートフォワードでリモートアクセス](https://qiita.com/Mohrey/items/61b5c84dec2ca194be51)