AWS VPC + EC2 でWeb Server・DB Serverを構築する①

こんにちは。
TWクライアントチームで、フロントエンドエンジニアをやっていますTKと申します。
普段はReact + TypeScriptな環境で、webアプリの開発を行っています。
今回フロントではなくAWSでインフラを構築する機会がありましたので、その時の備忘録になります。
初投稿かつAWS初心者かつインフラ初心者なので、至らない点たくさんあると思いますが温かく見守っていただけると幸いです。
アドバイス等もお待ちしております！

# 手順
1. VPCでネットワークを構築する
2. VPCをサブネットに分割する
3. インターネットゲートウェイを作成し、VPCにアタッチする
4. ルートテーブルを作成し、サブネットにアタッチする
5. EC2インスタンスを作成し、起動する
6. sshでEC2インスタンスに接続する

（注）AWSのアカウントは作成済みであることを前提に話を進めます。

その都度、参考資料のURL等は記載しますが【Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版】を全体のベースにしております。
インフラ初心者にとても優しい内容でした。
とてもありがたい！

https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=pd_sbs_1?pd_rd_w=HVOGw&pf_rd_p=021fa992-5050-4990-a948-59d02d1d2a57&pf_rd_r=YYGCNWJ4AXNGV2CTJ3Y0&pd_rd_r=acca8526-b4de-4c30-b119-36e37d90cc04&pd_rd_wg=UQSCs&pd_rd_i=4296105442&psc=1　

# 1. VPCでネットワークを構築する
はじめにVPCを使用しネットワークを構築します。

AWSのコンソールからVPCを選択します。
VPCの画面に遷移しますので、サイドバーのVPCをクリックします。
【VPCを作成】ボタンが、右上にありますのでクリックし、VPCを作成していきます。

1. 名前・IPv4 CIDRブロックを入力。
2. IPv6 CIDR ブロックはブロックなしを、テナンシーはデフォルトを選択します。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/64b3e8f2-bd1c-f99c-0860-1b9c27cd7318.png)

* IPv4 CIDRブロックとは？  
使用するIPv4の範囲になります。  
IPアドレスは32bitで構成され、8bitずつ「.」で分割し10進数で表記します。  
ネットワーク部とホスト部に分かれており、CIDR（サイダーと読むらしいです）表記では/の後にネットワーク部がどこまで続くのかを記載します。  
今回の10.0.0.0/16では、16なのでネットワーク部は左から2つ目の「.」までになります。  
ネットワーク部が同じIPは同一ネットワークに属していることになるため、10.0.0.0/16は10.0.0.0~10.0.255.255までが同一ネットワークになります。  
要するに、ネットワークを2の16乗(65,536)で分割したことになります。

【参考URL】
https://www.nic.ad.jp/ja/basics/terms/cidr.html

# 2. VPCをサブネットに分割する
先ほど作成したネットワークは、そのまま使用せずにサブネットに分割して使用することがほとんどのようです。
メリットとしては、物理的な隔離やセキュリティ上の理由等があるようです。

次は、VPCをサブネットに分割していきます。
サブネットは、

1. パブリックサブネット　=> インターネットからアクセスすることを目的としたサブネット
2. プライベートサブネット => インターネットから隔離したサブネット　

があるようです。
まずは、1. パブリックサブネットを作成していきます。

サイドバーの【サブネット】をクリックする。
右上に【サブネットを作成】ボタンがあるのでクリックし、

1. VPC ID => 先ほど作成したVPCを選択
2. サブネット名
3. アベイラビリティーゾーン
4. IPv4 CIDR ブロック

を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/aa1fc879-815d-efe6-bc76-72439e6cb0bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/4e7e582a-e24d-85d8-826f-8d130e7c864d.png)

IPv4 CIDR ブロックは、先ほど作成したVPC(10.0.0.0~10.0.255.255)をさらにどの範囲を分割するか？を指定します。
今回の場合10.0.1.0/24を指定していますので、作成するサブネットは10.0.1.0~10.0.1.255が範囲になります。

これで、10.0.1.0~10.0.1.255範囲のサブネットが作成されました。

# 3. インターネットゲートウェイを作成し、VPCにアタッチする
VPCにおいて、サブネットがインターネットに接続するためには、インターネットゲートウェイを使用する必要があります。
そのため、インターネットゲートウェイを作成していきます。

サイドバーの【インターネットゲートウェイ】をクリックする。
右上に【インターネットゲートウェイの作成】ボタンがあるのでクリックし、その後のページでさらに【インターネットゲートウェイの作成】ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/d4028d74-1efd-5ebc-7e47-ef37dcc5a761.png)
インターネットゲートウェイには名前を付けることもできますが、今回は空白にしています。

次に作成したインターネットゲートウェイをVPCにアタッチしていきます。

1. インターネットゲートウェイのページから、先ほど作成したインターネットゲートウェイにチェックをつける
2. 右上の【アクション】のドロップダウンから、【VPCにアタッチ】を選択する
3. 対象のVPCを選択し【インターネットゲートウェイのアタッチ】をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/cbc1d42c-656b-2539-6865-8d6ae02d3faa.png)

これで、インターネットゲートウェイをVPCにアタッチできました。

#4. ルートテーブルを作成し、サブネットにアタッチする
ネットワークにデータを流すには、ルートテーブルを作成する必要があります。
ルートテーブルは、宛先アドレス(ディスティネーション)・流すべきネットワーク先（ターゲット）の対応表になります。
ルートテーブルはVPCを作成した際に、デフォルトのルートテーブルが作成されているようです。
そしてサブネット作成時には、デフォルトのルートテーブルが適応されているようです。

まず、デフォルトのルートテーブルを確認します。
サイドバーの【サブネット】をクリックし、確認したいサブネットにチェックを付ける。
すると、下部に詳細が表示されルートテーブルにルートテーブルのID（リンク）があることが確認できます。
このリンクをクリックすると、ルートテーブルページに飛びます。
デフォルトのルートには、

>送信先：10.0.0.0/16
>ターゲット:local

だけが登録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/73eb13da-dc66-945e-dd13-c39ab8fe2681.png)

先ほど、ルートテーブルは、宛先アドレス(ディスティネーション)・流すべきネットワーク先（ターゲット）の対応表だといいました。
デフォルトの

>送信先：10.0.0.0/16
>ターゲット:local

の場合、10.0.0.0~10.0.255.255宛ての通信は、localに流すという意味になります。
これしか登録されていないので、サブネットは外部のインターネットとは通信できない状態になっています。
サブネットが外部に通信するためには、ルートテーブルに「0.0.0.0/0（デフォルトの転送先）をインターネットゲートウェイにする」設定を追加する必要があります。

実際にルートテーブルを作成していきます。
サイドバーの【ルートテーブル】をクリックする。
その後、左上の【ルートテーブルの作成】をクリック。（どうでもいいですが、今までは右上にあったのに今度は左にあるんですね、、、）

1. 名前
2. VPC => 作成したVPCを選択

を入力して作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/03738be6-1ec6-8715-dcfa-446d78e733bc.png)

1. 作成したルートテーブルにチェックを付け、下部にある【サブネットの関連付け】を選択する。
2. 【サブネットの関連付けの編集】をクリックし、先ほど作成したサブネットを選択し関連付ける。
3. 【ルート】タブに戻り、【ルートの編集】=>【ルートの追加】をクリックする。
4. 送信先：0.0.0.0/0、ターゲット:インターネットゲートウェイを入力し、作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/91ab4ba1-a601-fa60-9b0f-b74d66b52be8.png)

これでサブネットにルートテーブルがアタッチされたので、サブネットがインターネットに接続できるようになりました。

# 5. EC2インスタンスを作成し、起動する
次に、EC2インスタンスを作成しLinuxサーバを構築します。

まずAWSコンソールから、EC2を選択します。
サイドバーの【インスタンス】をクリックする。

1. 右上に、【インスタンス起動】ボタンがあるのでクリック
2. AMIを選択する => 今回はAmazon Linux 2 AMI (HVM), SSD Volume Typeを使用します
3. インスタンスタイプを選択し、【次のステップ】をクリック（【作成と確認】ではないです） => 今回はt2.microにします
4. ネットワーク（先ほど作成したVPC）・サブネット(先ほど作成したサブネット)・自動割り当てパブリック(有効)に変更し、ネットワークインターフェイスのプライマリ IPにIPを割り当てる(今回は10.0.1.10にします)
5. ストレージを設定する（今回はデフォルトのままにします）
6. 名前の設定（このEC2インスタンスはWeb Serverに使おうと思うので、test-web-serverにしました）
7. セキュリティグループの設定(別のセクションで変更するので、名前だけ変えてデフォルトのままにします)
8. 確認画面で起動をクリック
9. キーペアを作成（ファイルをダウンロードできるのは、この1度のみみたいなのでなくさないようにしてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/dfff6d1d-198d-bba5-e3ff-60f61600775e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/d83fba48-bf1c-2330-e1e5-ddeb6559d7f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/90ac561a-dc51-c728-74b4-c9b9a83a7549.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872449/3717d1ee-1e8f-1f5a-fb24-30bb5795a003.png)

これでEC2インスタンスが作成できました。

# 6. sshでEC2インスタンスに接続する
先ほど作成したEC2インスタンスに、sshで接続してみたいと思います。

サイドバーの【インスタンス】をクリックし、該当EC2インスタンスにチェックを入れ、下部に出てくる詳細のパブリック IPv4 アドレスをチェックしておく。
今回はmacを使用してssh接続します。

macの場合簡単で、ターミナルに

```
$ ssh -i [ダウンロードしたkeyファイル] ec2-user@[先ほど確認したパブリック IPv4]
```

を入力し、実行するだけです。


上記のコマンドを実行した際、下記のようなエラーが出るかもしれません。

>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>
>@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
>
>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>
>Permissions 0644 for [ダウンロードしたkeyファイル] are too open.
>
>It is required that your private key files are NOT accessible by others.
>
>This private key will be ignored.
>
>Load key [ダウンロードしたkeyファイル]: bad permissions
>
>ec2-user@[先ほど確認したパブリック IPv4]: Permission denied

このエラーの原因は、keyファイルのパーミッションのせいです。

```
$ chmod 400 [ダウンロードしたkeyファイル]
```

を実行して、読み取り専用にしましょう。

これでEC2インスタンスに接続できたかと思います。

#まとめ
今回は、AWSでネットワークを構築後、Linuxサーバを構築してみました。
次回はこのサーバを使用してWeb Serverを構築したいと思います。

ここまで読んでくださった方、ありがとうございます！
冒頭に申しました通り、初投稿かつAWS初心者かつインフラ初心者ですのでアドバイスをお待ちしております！

【次回の記事】
<a href="https://qiita.com/TK-TW/items/5893c9be5a1b3e9160b0">AWS VPC + EC2 でWeb Server・DB Serverを構築する②</a>