AWSで基本的なサーバー環境を構築してみました。~その2~

#はじめに
[前回作成したサーバー環境](https://qiita.com/President_Taka/items/a55c85996dd6a8a8bb4c)をもう少し障害性、冗長性をアップさせた構成に変更したいと思います。構成図は以下のようになります。

#構成図

![スクリーンショット 2020-03-24 15.31.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/a3a097f8-ff91-78e2-50b6-7a2b21ed6f81.png)


#変更内容
- EC2を2つ作成し、ロードバランサーの設置による冗長化
- RDSのMultiAZ構成(マスター、スレーブ)による自動フェイルオーバー


#作成手順

| リソース名          |    備考                                 |    
|:-----------------|:----------------------------------------|
| VPC              |                                       |   
| サブネット          |パブリックサブネット2つ、プライベートサブネット2つ作成。   |      
| インターネットゲートウェイ             |                          |       
| ルートテーブル      |                                         |        
| EC2 ※              |  AZを分けて2つ作成。                      |     
| RDS ※            | エンジンはMySQL。MultiAZ構成。               |  
| ELB ※              |  ALBを使用。作成したEC2をロードバランシング。    |
※ 作成後、接続確認を行う。

##VPCの作成
<img width="1437" alt="VPC作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/b2ee6a02-178d-a88d-aad6-a051c6c82ef4.png">

CIDRブロックの数値は構成図で示している範囲とします。
<img width="1417" alt="スクリーンショット 2020-03-18 12.39.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/7b1c5eda-904f-ea1c-2ec2-d9722613b251.png">


##サブネットの作成
パブリックサブネットとプライベートサブネットそれぞれ２つずつ作成します。
###1.パブリックサブネット
EC2インスタンスを設置するパブリックサブネットを作成します。
<img width="1437" alt="サブネット作成①外部用.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/39a99f71-8ae0-5082-0bec-6c4b50712c1e.png">

CIDRブロックの数値はこちらも構成図の範囲とします。AZを`ap-northeast-1a`と`ap-northeast-1c`に分けて作成します。
<img width="1417" alt="スクリーンショット 2020-03-18 12.48.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/0962090e-e5c7-9764-f533-37d447450d16.png">

<img width="1417" alt="スクリーンショット 2020-03-18 12.50.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/0505e307-6651-8fee-5d07-c9f428f8341a.png">

###2.プライベートサブネット
RDSを設置するプライベートサブネットを作成します。

<img width="1417" alt="スクリーンショット 2020-03-18 12.52.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/d92b2621-bd33-ba11-f6fe-5a28c4c8c5fc.png">

<img width="1417" alt="スクリーンショット 2020-03-18 12.53.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4265cac4-6f1d-8786-5dfa-634ec004c70a.png">

##インターネットゲートウェイの作成
作成したVPC内のサーバがインターネットと接続するための出入口を設定します。
<img width="1437" alt="igw作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/8936a1e8-a3d2-f9cf-1bbc-ce07376d4089.png">

インターネットゲートウェイの名称を入力します。
<img width="1417" alt="スクリーンショット 2020-03-18 13.38.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/7a60ce32-c49a-c588-375d-cbb7caf0413a.png">

作成したVPCに紐付けます。
<img width="1125" alt="スクリーンショット 2020-03-18 13.39.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/fca24df8-2739-3ede-d2a6-2dceea540aae.png">


<img width="1279" alt="スクリーンショット 2020-03-18 13.40.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/de542180-bd8c-dc27-0973-cd262277c0a5.png">


##ルートテーブルの作成
デフォルトでは同じVPC内のものしかアクセスできないため、ルート編集で設定したゲートウェイに紐づいているアクセスの通信を可能にします。
<img width="1437" alt="ルートテーブル作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/b42d3763-ffc5-fdf1-cc15-45ffc0b351b4.png">

こちらも作成したVPCに紐付けます。
<img width="1279" alt="スクリーンショット 2020-03-18 14.20.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/8650bdc6-cba3-d282-2616-9f286bf228ae.png">

ルートの編集を行います。
<img width="1287" alt="スクリーンショット 2020-03-18 14.22.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4aeaf39c-5cb7-3aea-c74d-1dfce900a626.png">

作成したインターネットゲートウェイをターゲットとして設定します。
<img width="1287" alt="スクリーンショット 2020-03-18 14.24.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ac64c43e-0d88-7224-b546-4643bf56006a.png">

このルートテーブルに2つのパブリックサブネットを紐付けます。
<img width="1361" alt="スクリーンショット 2020-03-18 14.25.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/57580b56-12a4-dd0a-4814-05929dabcc70.png">

<img width="1302" alt="スクリーンショット 2020-03-18 14.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/31805837-82da-e449-79f7-803dcfc4d4ed.png">

##EC2の作成
WEBサーバーが2つ必要なので、EC2を2つ作成します。
<img width="1437" alt="EC2作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/dd2b1df2-6a26-f907-106a-cac2d893d5be.png">

テスト用なのでAMI及びインスタンスタイプは無料利用枠を選択しています。
<img width="1437" alt="EC2作成②.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/2186e856-7a2b-3ff9-0d67-2503d2d41b53.png">
<img width="1437" alt="EC2作成③.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/37fd3227-e46a-02d3-e6ba-6e072c23ae05.png">

ネットワーク及びサブネットには作成したVPC及びパブリックサブネットを紐付けます。また、パブリックIPの自動割り当てを有効に変更します。
<img width="1421" alt="スクリーンショット 2020-03-18 16.05.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/40f23c46-31b8-4249-b5d8-bd1a94df4f76.png">

高度な詳細のユーザーデータ欄に以下を追記します。それによりEC2起動後に、webサーバーを起動させておくことができます。

```
#!/bin/bash
sudo yum update -y
sudo yum install httpd mysql update -y
sudo service httpd start
sudo chkconfig httpd on
```

デフォルトのまま次へ進みます。
<img width="1437" alt="EC2作成⑤.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/7a91c91f-265b-d630-59b3-3bbb8babcd3e.png">

EC2の名称を設定します。
<img width="1421" alt="スクリーンショット 2020-03-18 16.06.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/43dd0eaa-d91d-27d7-c85c-40756499c1e7.png">


新しいセキュリティグループを作成し、SSHとHTTPのポートを許可します。
<img width="1430" alt="スクリーンショット 2020-03-18 19.26.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/19da5783-0324-e748-3343-fced00370d95.png">


入力内容に誤りがないか確認し、EC2を起動します。
<img width="1430" alt="スクリーンショット 2020-03-18 19.29.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/12cd5a59-eefc-4dd6-5b13-947728121e2b.png">



新しいキーペアを作成しダウンロードすればEC2インスタンスの作成は完了です。
<img width="717" alt="スクリーンショット 2020-03-18 16.09.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/5f8cc6d7-8e49-6a75-e13c-e99583e33fa4.png">

もう一つ`ap-northeast-1c`側に作成するEC2を作成します。

<img width="1433" alt="スクリーンショット 2020-03-28 14.07.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4379910c-f1e8-1219-7bef-123acb97ea58.png">


こちらのEC2をパブリックサブネットの1c側に設置します。
<img width="1426" alt="スクリーンショット 2020-03-18 16.19.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/b5b24af4-eed0-6b75-505b-07fd4334576d.png">

<img width="1426" alt="スクリーンショット 2020-03-18 16.22.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/0edd1d89-99d2-ea09-a2b9-41cc125a1a7f.png">

先程作成したセキュリティグループを選択します。
<img width="1430" alt="スクリーンショット 2020-03-18 19.41.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4e334c07-eb6c-cffb-4d35-5c3dca8461e1.png">

確認して、起動します。
<img width="1430" alt="スクリーンショット 2020-03-18 19.42.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/3111d399-46d8-97b5-ef44-6ee2de6beea5.png">

キーペアも同様のものを選択します。
<img width="713" alt="スクリーンショット 2020-03-18 19.42.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/a89ef5c9-bc85-f51c-48e9-7e029828a60e.png">

##EC2へのSSH接続の確認
EC2インスタンスの状態が`running`に変わったら起動成功なので、それぞれのEC2のIPv4パブリックIPを確認しておきます。

<img width="1425" alt="スクリーンショット 2020-03-19 14.07.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/080a6525-299b-eecc-82bd-b6d8fbfbc967.png">


続いてEC2からSSHへの接続確認を行います。ターミナル画面を開き、先ほど作成したpemキーを`.sshフォルダ`に移動させます。2つのEC2インスタンス、それぞれをSSH接続可能か確認します。

```terminal:ターミナル画面
$ cp Downloads/test.pem .ssh/    #pemキーを.sshフォルダに移動                          
$ sudo chmod 600 ~/.ssh/test.pem　  #指定している鍵の権限が広すぎるため変更
Password:〇〇〇〇〇〇〇〇    #自身のPCのパスワード
$ ssh -i ~/.ssh/test.pem ec2-user@[IPアドレス]　　 #SSH接続の実行

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.　
```



## RDSの作成

### DBサブネットグループの作成

<img width="1437" alt="DBサブネットグループ作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/5792156a-20e6-b81d-08f6-e48c0e2c3877.png">

名称を入力し、作成したVPCと紐付けます。
<img width="884" alt="スクリーンショット 2020-03-21 12.42.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/79352461-d08a-77ae-dc85-fde8afecbed2.png">

作成したプライベートサブネット２つを紐付けます。
<img width="884" alt="スクリーンショット 2020-03-21 12.42.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/5d94dfdd-4a87-fa19-f844-ab677580aec5.png">




### セキュリティグループの作成

<img width="1284" alt="セキュリティグループ（RDS用）①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/431c0f26-a61d-d496-b5d4-6a2928909cb1.png">

<img width="1308" alt="スクリーンショット 2020-03-21 12.45.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/aef0327d-0102-28b7-baf7-cd44daab146c.png">

<img width="1405" alt="スクリーンショット 2020-03-21 12.47.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/2141f8e1-7e83-2dd0-b6d4-42170ac3d16a.png">

<img width="1436" alt="セキュリティグループ（RDS用）④.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/94b2cfc4-33e1-17e1-9d98-4fc4acc32b48.png">


### データベースの作成

<img width="1437" alt="RDS作成①.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/5b120d14-2409-33a7-31d3-0f2b10cbf642.png">

MySQLを選択します。
<img width="1437" alt="RDS作成②.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/a862e5a4-0fec-ae06-133c-fc4bc5154106.png">

<img width="1437" alt="スクリーンショット 2020-03-21 13.00.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/495d9e11-7709-8324-aaa8-223adc471da2.png">

MultiAZ構成としますので、次の部分をチェックします。
<img width="1437" alt="スクリーンショット 2020-03-21 13.03.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/516a4d84-a52c-5829-a458-3a81feef36ca.png">

設定欄を入力します。
<img width="1437" alt="スクリーンショット 2020-03-21 13.06.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/dd34c12c-2ba4-f322-fa20-7d1b851b55cb.png">

作成したVPC、サブネットグループ、セキュリティグループを紐づけます。
<img width="1437" alt="スクリーンショット 2020-03-21 13.15.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/43068bc3-726a-b7ce-a8ae-d186cc3f50b8.png">

今回は初期MySQLデータベースは不要なのでデータベース名は空白にし、その他の設定についてはデフォルトのままで作成します。
<img width="1437" alt="RDS作成⑦.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/3b7adb87-f1f1-c2cb-9f5a-3c6ac3303189.png">

##EC2からRDSへの接続確認

作成したRDSのエンドポイントをコピーします。
<img width="1437" alt="スクリーンショット 2020-03-21 13.41.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ea9ef2e1-ba0b-cf5d-86b0-7ee2cd4d0722.png">

EC2からRDSへの接続確認を行います。

```ターミナル.
$ mysql -h test-rds.cl0w7wsj1gla.ap-northeast-1.rds.amazonaws.com -u test -p  #RDSのエンドポイントとRDS作成時のマスターユーザ名（test）を使用
Enter password:testpass        #RDS作成時のパスワード
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.22-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 　　　　#exitで抜けます
```
以上の画面が表示されれば、接続完了です。

## ELBの作成

<img width="1425" alt="スクリーンショット 2020-03-19 14.44.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/0fe9841f-c2e8-da13-685e-a0df7214373a.png">

ALBを選択します。
<img width="1425" alt="スクリーンショット 2020-03-19 14.44.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/fc2baf83-9cda-5dd7-62df-41a136890a8b.png">

ロードバランサーの名称を入力し、今回は外部接続用のため`インターネット向け`を選択しておきます。
<img width="1425" alt="スクリーンショット 2020-03-19 14.51.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/9e0c3a50-dfd0-52ed-d8e1-f6553c5fd760.png">

作成したVPCを選択し、2つのEC2が設置してあるパブリックサブネットを紐付けます。
<img width="1425" alt="スクリーンショット 2020-03-19 14.52.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/968c4fc4-52d2-48de-dc41-f74326773c3c.png">

EC2と同様のセキュリティグループを選択します。
<img width="1425" alt="スクリーンショット 2020-03-19 14.55.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/b054096f-ca7c-ef08-b412-f7aca919d616.png">

ルーティングについてはデフォルトのまま進めます。
<img width="1425" alt="スクリーンショット 2020-03-19 16.40.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/2ad8b03b-6e9a-01a2-b25f-cf76dfa2bf1d.png">

<img width="1425" alt="スクリーンショット 2020-03-19 16.40.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/eb16e023-9465-5317-016e-c93efc544cb3.png">

ターゲットを作成した2つのEC2に指定します。
<img width="1425" alt="スクリーンショット 2020-03-19 16.42.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4b63e570-9c8a-ad02-e7c8-f85fbac469ad.png">

<img width="1425" alt="スクリーンショット 2020-03-19 16.44.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/9fadb541-df2a-3a7a-fd18-2423ca1bf0f6.png">

## ELB機能確認
実際にロードバランサーが機能しているか確認をします。まず、htmlファイルを2つのEC2インスタンスに作成します。

```terminal:ターミナル画面
$ sudo vi /var/www/html/index.html
<html>
Hello EC2!AZ-1a    #別のEC2はAZ-1cにする。
</html>
```
次に、ELBのDNS名を確認し、そこからEC2にアクセスします。
<img width="1437" alt="スクリーンショット 2020-03-21 13.53.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/cdf67787-533e-e5ac-2058-567a6876587e.png">

表示された画面のリロードを繰り返すと、アクセスされるEC2が変更されます。そのため、次のように表示されるhtmlファイルが異なります。
<img width="672" alt="スクリーンショット 2020-03-21 13.56.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/b7a54b8f-9225-cfd6-324a-3a3ecdc34c0c.png">

<img width="672" alt="スクリーンショット 2020-03-21 13.56.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/5e545b35-0e81-a543-255e-8e4011516041.png">

以上で、今回の構成図が完成となります。

##その他
今回の構成以外の対策としては次の内容が考えられます。
### `セキュリティ対策`
######・セキュリティグループの設定
通信を許可する送信元IPアドレスやプロトコルを必要なものだけに限定
######・CloudTrailの利用
ユーザーの行動ログを取得する等の監視
######・CloudWatchの利用
利用するリソースに対してメトリクスやログの収集、追跡

### `可用性対策`
######・Auto-Scalingの利用
EC2に高負荷がかかった場合、新たなEC2が自動的に作成されるよう設定

######・Route53を利用したフェイルオーバー
同じ構成のスタンバイを別リージョンに設置
######・リードレプリカの利用
RDSへの読み込み負荷を分散