【AWS】EC2とRDSを冗長化しALBで通信を振り分ける

#■はじめに
AWSでEC2(wordpress),RDSシングル構成を構築したので、そこから冗長化する際の手順をまとめました
AMIによるEC2複製手順、MultiAZ機能によるRDS冗長化手順、ALB作成手順となります。

#■対象者
本記事はAWS初学者向けの情報共有として構築手順をまとめています。
また、自分用の手順メモでもあります。

#■構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/9b53c883-4377-113e-2b09-539b4f880bb9.png)

まず、冗長化していない構成図は上記。

 - userはブラウザからIPを入力しhttp通信でEC2にアクセスする。
 - EC2にはmysql、wordpressをインストールし、SQL発行でRDSにアクセス、データを取得し画面表示を行う。
 - ssh接続はteratermでEC2に接続する際に利用する。
 - EC2は外部のユーザからのアクセスを受けるが、RDSにはアクセスさせない。そのためEC2はパブリックサブネットに配置し、RDSはプライベートサブネットに配置する。

ここから以下のように変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/1bcb796c-5b7b-a0b6-d242-fbd5c3549ebd.png)

 - EC2をAMIを用いて別AZに複製する。
 - RDSはマルチAZ機能で別AZに冗長化する。
 - EC2が複数になるので、前段にALBを配置し、通信を振り分ける。


#■作業内容
大まかに以下。

1. EC2を複製する
* ロードバランサーを作成する
* ブログアドレスの設定変更を行う
* EC2セキュリティグループの設定変更を行う
* RDSをmultiAZ構成にする

#■作業手順詳細

##1. EC2を複製する

<details><summary>【EC2のAMIを取得】</summary><div>

**1-1. EC2画面から EC2選択 - アクション - 停止を実行**

**1-2. 停止したら EC2選択 - アクション - image and templates - イメージを作成 を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/4d5570f4-2140-275b-34f2-47c35dcbaeec.png)

**1-3. 「イメージを作成」画面 以下を入力**

| 項目名 | 入力値 |
|:-:|:-:|
| イメージ名  | WebServer  |
| イメージの説明  | WebServer  |

その他項目はデフォルトで「イメージの作成」押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/329a0dbb-e6f4-3f4e-06dc-e68f538faf03.png)

</div></details>

<details><summary>【AMIを用いてEC2起動】</summary><div>

**1-4. EC2画面から「インスタンスを起動」押下**

**1-5. 左ペイン マイAMI に 作成した AMI があるので選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/0f659f0c-4dbe-32b3-dd14-fd4a37d00627.png)

**1-6. インスタンスタイプの選択**
t2.micro を選択

**1-7. インスタンスの詳細の設定** 
以下を入力

| 項目名 | 入力値 |
|:-:|:-:|
| ネットワーク  | MyVPC1  |
| サブネット  | Public Subnet2  |
| 自動割り当てパブリックIP  | 有効  |

**1-8. ストレージの追加**
デフォルトの8GiBとする

**1-9. タグの追加 以下を入力**

| 項目 | 入力値 |
|:-:|:-:|
| キー  | Name  |
| 値  | WebServer2  |

**1-10. セキュリティグループの設定**
「既存のセキュリティグループを選択する」にチェックを入れ、Web-SG-1 を選択
※既存のEC2もAMIで複製したEC2も同じセキュリティグループを使うということ

**1-11. キーペアの選択**
「既存のキーペアを選択」、任意のキーペア名を選択し、「インスタンスの作成」押下

これでEC2複製は完了。

</div></details>

##2. ロードバランサーを作成する

<details><summary>【ALB作成】</summary><div>

**2-1. EC2左ペイン ロードバランサー - ロードバランサーの作成 を選択を押下**

**2-2. ロードバランサータイプの選択画面**
Application Load Balancer を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/617f2608-40fe-e7bd-b1a2-da025858404e.png)

**2-3. Application Load Balancer を作成画面 以下を入力**

・基本的な設定

| 項目 | 入力値 |
|:-:|:-:|
| ロードバランサー名 | LB-1 |
| スキーム  | インターネット向け  |
| IPアドレスタイプ  | ipv4  |

・ネットワークマッピング

| 項目 | 入力値 |
|:-:|:-:|
| VPC | MyVPC1 |
| マッピング  | ap-northeast-1aとPublicSubnet1, ap-northeast-1cとPublicSubnet2  |

どのアベイラビリティーゾーンのどのターゲットにルーティングするかを設定

</div></details>

<details><summary>【LB用のセキュリティグループの作成】</summary><div>

・セキュリティグループ
「新しいセキュリティグループの作成」を選択し、セキュリティグループ設定画面で以下を入力

| 項目 | 入力値 |
|:-:|:-:|
| セキュリティグループ名 | LB-SG-1 |
| インバウンドルール  | タイプ:カスタムTCP, プロトコル：TCP, ポート範囲:80, ソース：カスタム,0.0.0.0/0  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/991ebb4f-c770-7c3a-cacd-2beedb89ea16.png)


作成したら、「Application Load Balancer を作成」画面で LB-SG-1を選択し、defaultは×で削除

</div></details>

<details><summary>【ターゲットグループの作成】</summary><div>

・リスナーとルーティング
「ターゲットグループの作成」押下

・基本的な設定

| 項目 | 入力値 |
|:-:|:-:|
| ターゲットタイプの選択： | インスタンス |
| ターゲットグループ名:  | TG-1  |
| プロトコル: | HTTP |
| ポート:  | 80  |
| VPC： | MyVPC1 |
| プロトコルバージョン:  | HTTP1  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/b603b2e4-1792-fa3b-6aa7-e08ff42d121d.png)

・ヘルスチェック

| 項目 | 入力値 |
|:-:|:-:|
| ヘルスチェックプロトコル: | HTTP |
| ヘルスチェックパス:  | /readme.html  |
curlコマンド実行時に200が帰ってくるような適切な実在するパスを設定する必要がある

・ヘルスチェックの詳細設定
EC2インスタンスのヘルスチェック間隔、閾値を設定

| 項目 | 入力値 |
|:-:|:-:|
| 正常のしきい値: | 2 |
| 間隔:  | 10  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/3641523e-bd73-bf50-3248-d1639a9ad1e7.png)

・ターゲットの登録画面
インスタンスでwebserver1,2両方選択し、「保留中として以下を含める」を押下

そうすると登録済みターゲットにwebserver1,2が表示される
これでwebserver1,2に通信が振り分けられるようになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/5c4a59bb-931a-c42a-4b6b-1919e0d4906b.png)

「ターゲットグループの作成」押下

**2-4. 「Application Load Balancer を作成」画面に戻り、リスナーとルーティング - デフォルトアクションに ターゲットグループ TG-1を選択**

**2-5. 「ロードバランサーの作成」押下**

ターゲットグループ TG-1 のターゲットタブからwebserver1,2のヘルスチェックのステータスを確認できる
ステータスチェックが問題なければhealthyとなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/a7c14cf3-bfeb-733b-d710-91e9ef4848e7.png)

ヘルスチェックの設定を変更する場合はアクションから変更可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/1ed0594f-800c-07d0-6392-d2b497380db6.png)

</div></details>

##3. ブログアドレスの設定変更を行う

<details><summary>【RDSのサイトアドレスを書き換える】</summary><div>

前段にALBを配置したため。userからのアクセスはALBが受けるので、
ブログサイトアドレスをEC2のパブリックIPからALBのエンドポイントに変更する。

**3-1. teratermでwebserver1,2どちらかにログインし以下コマンドでRDSにCLI接続する**

**3-2. 以下を実行**

```
# mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u XXXXXXXX -p
```

※伏字となっている部分はRDS - database-1 - 接続とセキュリティタブに出ているエンドポイント名
　-u はwordpressインストール時に指定したユーザ名

```
> USE wordpress
> SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');
```

※ここで表示されるのはどちらかログインした方のEC2のパブリックIPが登録されている

```
> UPDATE wp_options SET option_value = 'ロードバランサーのDNS名' WHERE option_name IN ('siteurl', 'home');
```

ロードバランサーのDNS名は以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/80391db9-9184-1a69-5e7e-9015a154561b.png)

</div></details>

##4. EC2セキュリティグループの設定変更を行う

<details><summary>【EC2はLBからの通信のみ許可する】</summary><div>

EC2のセキュリティグループは、HTTP通信のすべてを許可する設定されているので、ロードバランサーからの通信のみ許可するよう変更する

**4-1. EC2画面 - セキュリティグループ - Web-SG-1 - インバウンドルールタブ - インバウンドのルールを編集を押下**

**4-2. インバウンドルールを編集**
HTTPすべて(ソース：0.0.0.0/0,::0/)があるので、LB以外からのインバウンドも許可することになっている。そのため削除する。その代わりに タイプ:HTTP ソース：LB-SG-1 を追加する。
ただし、teratermで接続するのでSSHは残す。
以下のようにHTTPのソース LB-SG-1を設定したものを作成し保存する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/9c430506-e36c-3358-f199-7e8ad1ae4f44.png)

</div></details>


##5. RDSをMultiAZ構成にする


<details><summary>【シングルからMultiAZへ】</summary><div>

**5-1. RDS - database-1にチェックを入れ「変更」 押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/76e93146-bf4c-9b13-186b-2a87d6f6730a.png)

**5-2. DB インスタンスを変更: database-1　画面**

・可用性と耐久性
マルチAZ配置:スタンバイインスタンスを作成する (本稼働環境向けに推奨)にチェックを入れて続行を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/c86fcfa9-8b8f-c5a0-989e-32fcac120159.png)

・変更のスケジューリング
すぐに変更にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/71d7f214-02d6-00b7-1d26-f3edfb123bbc.png)

変更後、時間がたつとマルチAZありに変わる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/fb259cf4-9d36-c782-54f6-519578eecf58.png)

___
【補足 フェイルオーバーのやり方】

**補足-1. データベース - database-1 - アクション - 再起動 を選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/b5281906-cb23-adf5-58ce-bb0aae8a1b7e.png)

**補足-2. DBインスタンスを再起動画面で「フェイルオーバーで再起動しますか？」にチェックを入れて確認を押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/991566b5-5a07-587b-58ef-bbcfba97cbbd.png)

**補足-3. AZが切り替わっていることが確認できる**

・再起動前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/69cfb308-561a-3140-2465-79a5c025b64b.png)

・再起動後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/b9d6e9ff-da6d-f4e5-e8bb-e295e5e5cf56.png)

※何度か再起動を繰り返してみたが、表示が変わらないことがあった。表示が変わるまでラグがある？

___

</div>
</details>


以上