スケーラビリティのあるブログサービスを構築する

---

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

---

##　前回までの環境
前回までのハンズオンでは、以下の図のような冗長構成のブログサービスを作成しました。方法については前回の記事をご覧ください。
https://qiita.com/pd1/items/cf17af9641503e7c1916
![スクリーンショット 2021-10-21 23.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/153f7d30-cde0-fc58-77f6-2a89eae460a7.png)

## はじめに
　前回の構成の目的は、冗長化をすることで耐障害性を高め、負荷分散をしていくことになります。しかし、この状態では、キャンペーンなど突然大量の接続があった場合に、準備しておいたEC2以上の対処ができなくなってしまいます。
　そこで今回の目的は、前回の弱点を補うため、接続がある一定量、一定期間で増加した場合に、自動的にスケールアウトを行う構成にすることです。また、稼働し続けるとコストがかかってしまうので、スケールインの設定も行います。このような増加・減少を自動で対応することがスケーラビリティのある構成となります。
　今回は、CPU使用率を監視して、70%以上でスケールアウト、30%以下でスケールインで設定します。
　構成図は下記のようになります。
![スクリーンショット 2022-01-29 20.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/fa505822-4461-f64f-cf9b-114ea8dd4bff.png)


## 使用するサービス
主に使うサービスは、
- EC2
- RDS
- ELB
- Cloud Watch
- AutoScaling
です。

## 実際の手順
### 起動テンプレートの作成
　起動テンプレートとは、EC2を起動するテンプレートのようなもので、AMI・インスタンスタイプ・Key Pair・Securlity groupを設定します。似たようなものに、起動設定がありますが、起動テンプレートは、バージョン管理ができるのに対し、起動設定は毎回設定を１から作らないといけないので、起動テンプレートを使用します。
　まず、左のリストより起動テンプレートの作成をクリックして実際に作成していきます。(重要な部分だけピックアップしていきます。)
![スクリーンショット 2022-01-27 8.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/801fe440-1d35-536b-052a-24c082b3cf6d.png)
・テンプレートのバージョン説明
　ここを数字で指定することでバージョンの指定ができます。
・Auto Scalingのガイダンス
　今回はAuto Scalingとして使用するのでチェックをつける。
![スクリーンショット 2022-01-27 8.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/1b74ff03-1e5f-6a85-b6d2-c40b56f05182.png)
![スクリーンショット 2022-01-27 8.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/5c1a67ff-7502-4bda-0ad8-c4a986ef88df.png)
・AMI・Securlity group・Public IP・Nameタグの設定
　ここの設定がEC2作成時と同じの設定部分になるので、今回は以前作成したものと同じ設定を行なっていきます。Nameタグは、スケーリングによってスケールアウトしたEC2に対して付与されます。

### Auto Scaling groupの設定
 EC2のページのリストからAuto Scaling Groupをクリックして作成。
　![スクリーンショット 2022-01-27 9.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/f2b8acf0-f436-1e2b-e1de-74d286503977.png)
・機動テンプレートとバージョン
　先ほど作成した起動テンプレートとバージョンを指定します。
![スクリーンショット 2022-01-27 9.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/392774ae-0ac8-54ab-8453-0ce6b530a31c.png)
・ターゲットグループの作成
　前回作成したターゲットグループを指定する。
![スクリーンショット 2022-01-27 9.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/dfd317a1-d8a2-ab71-2e3d-5a41f297694d.png)
・ヘルスチェックの指定
　ヘルスチェックを行わないと何か障害が起きた場合に、ユーザーが接続できない状態になるので、つけておきます。
![スクリーンショット 2022-01-27 9.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/f8c312e8-6070-cfa2-4026-bc36b666aea8.png)
・グループサイズの設定
　ここでスケーリングする際の最小、最大、希望容量を指定します。
・スケーリングポリシー
　スケーリングポリシーは、どのような状態になったらどうするか設定します。あとで、Cloud watchと連携するので無しにしておきます。

・EC2の起動を確認する
　最小キャパシティである２つのEC2が立ち上がっているのが確認できます。仮に１つ終了させてみても、再度新しいのが立ち上がるのが確認できます。

### Cloud Watchを設定する
 アラームの作成を選択。メトリクスの選択をします。メトリクスとは、時間ごとに監視対象の動きをグラフ化したものです。今回は、EC2のAuto Scalingグループで作成しものを対象に、CPUUtilizationというCPU使用率を監視するメトリクスを選択します。
 次に条件の設定をします。今回は、CPU使用率が70%以上の時アラームを発動する。CPU使用率が30%以下ならアラームを発動する。の２つの条件で作成します。
![スクリーンショット 2022-01-27 10.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/b13ee4bc-7c01-c338-6a16-e5faa781de77.png)
　設定が終了すると、アラームの箇所で確認できるかと思います。
![スクリーンショット 2022-01-27 10.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/98f2eccc-50a5-13da-ffc8-575079c9b721.png)
　CPU-LowがCPU使用率30%以下、CPU-Hiが使用率70%以上の設定です。現在EC2は何も負荷がかかっていないのでCPU-Lowがアラートが出ているのが確認できます。
## Auto ScalingとCloud Watchの紐付け
　では、実際に作成したAuto ScalingとCloud Watchを紐づけていきます。
　Auto Scalingのページで自動スケーリングのタブから、スケーリングポリシーを選択します。以下の写真のように、先ほど作成したアラームを設定して、実行するアクションで追加・削除とその個数を選択していきます。
![スクリーンショット 2022-01-27 10.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/2c304650-0b6d-f40b-440c-81bc83c5b3aa.png)

### Auto Scalingテスト
　それでは、実際にスケーリングするかをテストしていきます。まずにEC2に接続をします。

```
$ top
```
のコマンドで接続したEC2のCPU使用率が確認できます。
![スクリーンショット 2022-01-27 10.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/83a6957c-20e8-6008-e715-d9a34909fcfe.png)
確認できたら、次に実際に負荷をかけていきます。

```
$ yes >>> /dev/null &
```
このコマンドを入力することで負荷をかけることができます。&はバックグラウンドで動かすことができます。このコマンドを４つ程入力すると
![スクリーンショット 2022-01-27 10.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/38c933fd-ad36-ef69-1b97-7d93ca50b190.png)
図のようにCPUに負荷をかけることに成功しました。
　次、Cloud WatchのメトリクスからCPU使用率を確認していきます。![スクリーンショット 2022-01-27 12.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/173917e6-1994-5c0a-caeb-060bbcd13ae4.png)
少し時間が経つと、図のように上昇しているのが確認できるかと思います。
スケーリングされているか確認すると
![スクリーンショット 2022-01-27 12.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/61f2fc7a-9977-52a3-5648-c7435573e37a.png)
２つあったインスタンスが４つに増えていることが、確認できればスケーリング成功です。
　次に、スケールインのテストもします。先ほど入力した負荷をかけるコマンドを停止していきます。

```
$ kill {topコマンドの1番左のPIDを入力}
```
その後topコマンドを入力すると、削除されているのが、確認できるかと思います。少し時間が経過したのち、Cloud Watchを確認すると
![スクリーンショット 2022-01-27 13.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/9aa6c618-de9b-648a-f800-97858448f446.png)
減少しているのが確認できEC2の方も
![スクリーンショット 2022-01-27 13.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/70eb9963-8495-650e-8ae8-f7a040421b75.png)
起動しているのが２つのみになっていれば成功です。

### 苦労した点
①起動テンプレートの作成
　起動テンプレートを作成した際、パブリックIPの有効化の設定を忘れていて、エラーに引っ掛かり１時間ぐらい悩みました。最後の設定の確認画面の確認をちゃんとします。
②Auto Scalingの負荷テスト
　今回Auto Scalingを設定した時点で２つのEC2が立ち上がりましたが、以前使用したものが立ち上がったものと勘違いし、そちらに負荷をかけてテストをしていました。
結果、アラートは無反応でかなり悩みました。
　失敗すると、学びも多いので地道にやっていこうと思います。