【AWS】冗長性のあるブログサービスを構築してみた。

# はじめに
この記事はインフラ初心者の私がAWS Cloudtechを通して学んだことを
記録＆アウトプットするための備忘録です。

# ゴール
耐障害性が高い冗長化の構成を構築する。

# 目的
・冗長化構成の環境構築をできるようにする。
・RDSのマスター/スレイブについて理解する。

# 環境
・Windows10
・TeraTerm Version 4.105
・Word Press Version 5.7

# 環境構築
最終的な構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/5c014568-98b9-c0af-2da0-f1ebce1f2c8b.png)

# 手順

## 事前準備
[前回のハンズオン](https://qiita.com/hargen888/items/a30c29d27aa7eebd7bce)後にEC2の停止とRDSの削除を実施したため事前準備を実施
①EC2の起動
対象のWebServerを選択して[インスタンスの開始]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/ee88d109-e76c-a2f2-8afa-a0e749962130.png)

②RDSの復旧
RDSのメニューの左ペインから[スナップショット]を選択。
一覧から対象のスナップショットを選び、[スナップショットを復元]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/4fc86f18-2701-eb13-a514-a4e8247c2780.png)

設定画面-1 
DBの仕様:MySQL Community
設定のDBインスタンス識別子をdatabase-1とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/9aa34364-2ace-3432-41a0-c097f66dcb8f.png)

設定画面-2 
接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/c18089c5-2a76-d42d-d4fc-a6a608fc04fc.png)

VPC:test-vpc
サブネットグループ:test-subnetgroup
パブリックアクセス可能:なし
VPCセキュリティグループ:既存の選択→RDS-SG-1を選択

設定画面-3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/6ea9b56d-f59e-c62a-b254-0143c2bbfb9d.png)

DBインスタンスサイズ:バースト可能クラス
以前の世代のクラスを含めるを有効にする
ストレージ:デフォルト設定でOK

設定画面-4 以下設定をして[DBインスタンスの復元]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/72b222a6-0b30-ad3d-ea64-4ddc05e06031.png)

可用性と耐久性
マルチAZ配置:スタンバイインスタンスを作成しないでください
アベイラビリティーゾーン:ap-northeast-1a

データベース認証:パスワード認証

EC2インスタンスのパブリックIPを検索窓に貼り付けブログ閲覧できるかを確認する。

## インスタンスログイン後の手順
インスタンスにログインしroot権限に変更

```
sudo su -
```
/var/www/html/に移動

```
cd /var/www/html/
```

llで確認後、viコマンドでindex.phpを開く

```
vi index.php
```

define~配下にカーソルをあててoでINSERTモードにする

```
echo '<p>Web Server 1</p>';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/f27e788e-f1c6-b0fb-d787-1f5d6c7429a2.png)

を入力してctrl + c → :wqで保存して閉じる

### AMIの作成

①EC2インスタンスを停止後、[イメージを作成]をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/19161ff7-f8b7-c12a-949e-08c8a1159388.png)

②イメージ名とイメージの説明を入力後、[イメージを作成]をクリック
※その他は今回はデフォルト設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/87b4040e-0ac0-f474-7eba-e5af0f14ba97.png)

③インスタンスメニューから[インスタンスを起動]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e00cd9cf-2a49-4c2d-b377-1ce35e8aec36.png)

④先ほど作成したAMIを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/cbae7140-bb7b-5b76-df41-5e6f142bc952.png)

⑤詳細は割愛するが、以下設定でインスタンスを作成
インスタンスタイプ:t2.micro
インスタンスの設定:ネットワーク test-vpc , サブネット PublicSubnet2 ,自動割り当てパブリックIP 有効
ストレージの追加:デフォルト
タグの追加:Nameタグ WebServer2
セキュリティグループの設定: 既存のセキュリティグループ WebServer1と同じもの(Web-SG-1)
キーペア:WebServer1と同じもの

⑥WebServer2にログインしてindex.phpの内容に変更を加える
Web Server 1となっていた箇所をWeb Server 2に変更して保存。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/05511033-5247-e501-99fc-4322f19e5276.png)

⑦Webserver1を起動しておく。

### ELBの作成
①EC2メニューの左ペインから「ロードバランサー」を選択して[ロードバランサーを作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/d8c096ae-bd0a-7e34-9524-5ff3bf2cb177.png)

②ALBを作成
※Gateway Load Balancerなんてあるの初めて知った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/a143b301-2986-bf8e-5218-ab590f90cd05.png)

③赤枠箇所を設定して[次の手順:セキュリティ設定の構成]をクリック
設定画面-1
(リスナーはデフォルト設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/4f9ea482-56fc-9f93-05c1-6e1aa92a3057.png)

設定画面-2
VPCはtest-vpc , アベイラビリティーゾーンはPublicSubnet1,2を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e1860ad3-2338-7430-cf2a-0df67f2e0af9.png)

④新しいセキュリティグループを作成し、[次の手順:ルーティングの設定]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/6e91e555-2ac0-78f5-c0de-1a78bb85eacf.png)

⑤ターゲットグループを画面のように設定して、[次の手順:ターゲットの登録]をクリック
設定画面-1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/6767104a-3b80-c755-788e-ffaef1a2bfff.png)

設定画面-2
※10秒間隔でヘルスチェックを行い、2回連続でヘルスチェックが成功することで正常とみなすように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e532e579-becb-c8bf-0c23-dc3236c8d273.png)

⑥ターゲットに登録するインスタンスを選択して[登録済みに追加]をクリック後、[次の手順:確認]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/cefc18da-d978-e4f8-5aa5-004296590c8f.png)

⑦内容を確認して問題がなければ、[作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/f78d8417-edd2-2526-f0e7-380174482842.png)

⑧ロードバランサーが正常に作成されたことを確認して、[閉じる]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/ebd5a292-5d68-ab3c-8166-074278320218.png)

作成したターゲットグループのTargetsタブからインスタンスのヘルスチェック結果を確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/78620710-8cd4-bc9a-df64-43f8b29939c2.png)

## RDSの操作
RDSの中に設定されているサイトアドレスをロードバランサーのDNS名に書き換える
①WebServer1 or WebServer2にログインして以下のコマンドを実施

```
mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u wordpress -p
```
※database-1.xxxxxx~の箇所にはRDSのエンドポイントを入れてください。

コマンド実行後、パスワードを入力してMySQlにログインすることができました。
(私はOracleDBしか触ったことがないのでMySQLは未知です。ワクワク)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/b5b1f694-68b9-c7b9-ae12-93b6f958e895.png)

②wordpressのDBを使用するコマンドを実施

```
USE wordpress
```
③SELECT文を実行する

```
SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');
```
WebServer1のパブリックIPになっているため変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/dd7578c3-8c9e-15a4-6741-9fd6f487aa09.png)

③LBのDNS名でアップデート文を実行する。

※サイトアドレス箇所にロードバランサーのDNS名をコピーして貼り付ける

```
UPDATE wp_options SET option_value = 'http://xx.xx.xx.xx' WHERE option_name IN ('siteurl', 'home');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/7932ce0e-9c34-b57b-1c5c-661b5b7202f7.png)

SELECT文を再実行してテーブルの内容がUPDATEされていることを確認。
siteURLとhomeURLがLBのDNS名に変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/3deaf18b-9894-2015-7bb6-9b4fd4cbb246.png)

パブリックIPを検索窓に貼り付けてブログが閲覧できることを確認。
また、更新ボタンをクリックしてWebServer1,2の表示が切り替わっていることから、
LBが正常に動作していることを確認。
![Videotogif-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/c875fe45-3a6f-e83c-4113-fdbdf11e24d1.gif)

※gif初めて使いましたが便利ですね～


### SG設定変更
現在の設定だとすべてのHTTP通信を許可していることになるため、LBからの通信のみを許可するようにSGの設定を変更

変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/982b052b-11cd-ff18-e093-877d1a2c1269.png)

変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/0df69cc2-f1fe-8d6e-8fc1-84654c668fcf.png)

変更後も問題なくブログにアクセスできることを確認
![Videotogif-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/878fa357-4f61-94b7-aef6-8ec9574acb91.gif)

### 障害確認
インスタンス停止後も問題なくブログを閲覧できるかを確認する。

WebSerber1を停止する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/fde9ae5c-857c-6370-da08-2ad2fb2ff2d7.png)

停止後もWebServer2で引き続きブログを閲覧できることを確認。
![Videotogif-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/03c3b55b-fe80-7f2d-a546-d1b11ea331b7.gif)


### RDSの冗長化
①対象のDBを選択して[変更]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/ab97fe68-bb60-80cb-9c15-486808b57f21.png)

②設定画面の可用性と耐久性の「マルチAZを配置」を[スタンバイインスタンスを作成する]に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/00073cc9-6f4f-e836-fd8d-c3dbd8ac7330.png)

その他の設定はデフォルトのまま、[続行]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/d2e58092-c767-0d2f-8564-296d7e726004.png)

③変更内容を確認して問題がなければ、[DBインスタンスを変更]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/fe84f6d0-ee9c-a6e7-9eef-c100522fe4ac.png)

変更が完了してDBのステータスが利用可能になった後、マルチAZありになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/7806a496-aa4b-0f4b-975e-2f1b3e955f50.png)

RDSのマルチAZ化が完了。

③RDSを手動で再起動してRDSがフェイルオーバーするか確認する。
※フェイルオーバーとは障害発生時に自動的に予備のシステムに切り替えること。
(SAAの試験対策問題でも何度か登場した用語でしたが、知識が定着していなかったので今回のハンズオンで定着させます笑)

RDSを選択してアクションから[再起動を選択]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/c49fb3e7-1446-0346-ce10-eab6f38c297c.png)

フェイルオーバーで再起動しますか？にチェックを入れて[確認]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/53fe9903-32a6-5210-dbd2-808146110571.png)

再起動実施後、failoverされていることをログとイベントから確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/a85f9b80-8ca3-83ef-7a30-7e1f29d0b88d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/0b25c378-5857-be0c-7b1c-4ca94f7da841.png)

※スレーブ機では参照のみで書き込みはできない。

# 終わりに
冗長化構成の環境構築について学びました。
自分はDBはOracleのGUIのやつ(SQL Developer)しか触ったことがなかったので、MySQLをCLIで触ったのはいい経験になったと思います。(まだ全然触ってないですが笑)
MySQLの良さげなQiitaの記事を見つけたのでこちらでMySQLの操作を少しずつ覚えていこうと思います。
[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)

このハンズオンはAWS CloudTechのもくもく会中に実施したのですが、かなり集中して取り組むことができました。
今後ももくもく会には積極的に参加していきたいと思います。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

# おまけ：gif画像の作成方法
今回初めてGIF画像を作ったのですが、Windows10の標準機能と標準搭載アプリで動画を作成し、
フリーサイトでgifを作成しました。
他にも調べればもっと良いツールがあるかもしれません。

■参考URL
・[Windows10 の標準機能で画面録画の動画とキャプチャを撮る方法「スクリーンショット」](https://www.pasoble.jp/windows/10/screen-capture.html#c2a)
・[Windows10 で動画のトリミング(切取り)をする方法「フォト ビデオエディター」](https://www.pasoble.jp/windows/10/douga-trimming.html)
・[動画をGIFに変換](https://rakko.tools/tools/86/)

# おまけ：WordPressのDBのテーブル一覧
WordPressのDB内にあるwp_optionsというテーブルを今回のハンズオンで触りましたが、
どんな構造なのか軽く調べてみました。
12個のテーブルがあり、投稿やユーザ情報などを保管するテーブルがあるみたいです。
詳しくは以下のサイトに載っています。

■参考URL
[WordPressのデータベースの中身はどうなっているのか？](https://wpmake.jp/contents/security/database/)