[AWS_21]ALBを導入してブログサイトを冗長化する

#環境
Amazon Web Service

* EC2(t2.micro)
* RDS

ローカルPC

* MacBook Pro(2.9 GHz デュアルコアIntel Core i5 , 8 GB 2133 MHz LPDDR3)
* macOS 11.3.1（20E241）

#作業概要
EC2インスタンスがシングルポイントとなっているため、EC2がダウンするとWebServerにアクセスできなくなってしまう。そこで、複製したEC2とロードバランサーを追加することにより、EC2がダウンした時にもう1台のEC2へアクセスできるようにしてサービスの冗長化を図る。
###Before
![構成図06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/4e68eff6-1a03-053c-cad2-1cbb672b9872.png)
###After
![構成図08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/50fb08a3-9d4f-af9d-5412-cb4d3b036a05.png)



#ALBの導入
###ALBの作成
`ロードバランサー　＞　ロードバランサーの作成`をクリックする。
###手順 1: ロードバランサーの設定
名前:`LB-1`
スキーム:`インターネット向け`
VPC:`MyVPC`
アベイラビリティゾーン:
`ap-northeast-1a PublicSubnet1`
`ap-northeast-1c PublicSubnet2`
###手順 3: セキュリティグループの設定
セキュリティグループの割り当て:`新しいセキュリティグループを作成`
セキュリティグループ名:`LB-SG-1`
**ルール(デフォルト)**

タイプ|プロトコル|ポート範囲|ソース
---|---|---|---|---|---|---
カスタム TCP|TCP|80|カスタム 0.0.0.0/0, ::/0
###手順 4: ルーティングの設定
ターゲットグループ:`新しいターゲットグループ`
名前:`TG-1`
ヘルスチェックパス: `/readme.html`
**ヘルスチェックの詳細設定**
　10秒ごとにヘルスチェック通信を飛ばして、2回OKだったら正常とみなす。
　正常のしきい値:`2`
　間隔:`10`
###手順 5: ターゲットの登録
WebServer1,2を登録済みに追加する。
###確認
問題なければ作成をクリックする。

###ヘルスチェック正常性確認
`ターゲットグループ　＞　TG-1`でインスタンスのステータスが <B><font color=green>healthy</font></B> であることを確認する。

###RDSに設定されているサイトアドレスをALBのDNS名に書き換える
* EC2インスタンスにSSH接続し、以下コマンドを入力してRDSにアクセスする。

```consol
mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u username -p
```

コマンド|内容
---|---
-h|ホスト名を指定オプション
database~.com|RDSのエンドポイント
-u|ユーザ名オプション
username|ユーザ名
-p|パスワードオプション
　-pオプションにより、パスワードを求められるのでパスワードを入力する。
<br>

* `wordpress`のテーブルを使用することを宣言する。

```sql
MySQL [(none)]> USE wordpress
```

* 現在のサイトアドレスを確認する。(WebServer1になっている)

```sql
MySQL [wordpress]> SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');

+-----------+-------------+----------------------+----------+
| option_id | option_name | option_value         | autoload |
+-----------+-------------+----------------------+----------+
|         2 | home        | http://xxx.xxx.xx.xx | yes      |
|         1 | siteurl     | http://xxx.xxx.xx.xx | yes      |
+-----------+-------------+----------------------+----------+
```

* サイトアドレスをALBのDNS名に更新する。

```sql
MySQL [wordpress]> UPDATE wp_options SET option_value = 'LB-1-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com' WHERE option_name IN ('siteurl', 'home');
```

* サイトアドレスが更新されていることを確認する。(ALBのDNS名)

```sql
MySQL [wordpress]> SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');

+-----------+-------------+--------------------------------------------------+----------+
| option_id | option_name | option_value                                     | autoload |
+-----------+-------------+--------------------------------------------------+----------+
|         2 | home        | LB-1-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com | yes      |
|         1 | siteurl     | LB-1-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com | yes      |
+-----------+-------------+--------------------------------------------------+----------+
```

###ブログサイトにALBのDNS名でアクセスできることを確認する

* ALBのDNS名`LB-1-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com`をブラウザのURL欄に入力して、ブログサイトにアクセスできるか確認する。
* 何度も更新ボタンを押してアクセスすると、WebServer1にアクセスしたり、2にアクセスしたりする。

###インターネットからWebServerへ直接のアクセスを拒否する
現状のWebServerのセキュリティグループの設定だとインターネットからWebServerへ直接アクセスできるようになっているため、ロードバランサーを経由しないとアクセスできないようにする。変更概要は以下。
[http,ssh]`インターネット → EC2インスタンス(WebServer)`
　　　　　　　　↓↓↓
[http]　　`インターネット → ロードバランサー → EC2インスタンス(WebServer)`
[ssh]　　 `インターネット → EC2インスタンス(WebServer)`
<br>

* WebServerのセキュリティグループ(Web-SG-1)を修正する。

タイプ|プロトコル|ポート範囲|ソース|説明 - オプション
---|---|---|---|---
HTTP|TCP|80|sg-xxxxxxxxxx / LB-SG-1|–
SSH|TCP|22|0.0.0.0/0|–
<br>

* セキュリティグループを修正後も、変わらずWebServerにアクセスできることを確認する。

#障害試験
EC2インスタンスを片系にした場合でも、正常にWebページが表示されるか確認

試験項番|WebServer1|Webserver2|アクセスした際に表示されるサーバ名
---|---|---|---
1.|起動|起動|両方
2.|停止|起動|WebServer2のみ
3.|起動|停止|WebServer1のみ
4.|起動|起動|両方