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

# 内容
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
「冗長性のあるブログサービスを構築する（冗長構成）」のレッスンの続きです。
前回までの構成
![スクリーンショット 2021-06-21 9.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790886/50bfad0b-633c-5ab8-407c-fd94769ca7b0.png)
前回の記事
https://qiita.com/zakinicof/items/a320268727f92d06a3b4
エンドユーザーから大量の通信があっても、ELBを配置しているので、2台のEC2インスタンスに対しては通信を分散して振り分けてくれる構成でした。
しかし、2台のEC2が処理しきれないほどの通信が大量発生することも想定し、Auto　Scalingを設定してEC2を条件に合わせて増減してくれるように構成したいと思います。
具体的には、ELBの配下にAuto Scalingグループを紐づけて、EC2インスタンスを最小２、最大４の範囲でスケーリングをさせます。Auto Scaling全体のCPU使用率を監視するアラームを2つ作り、アラームとAuto Scalingのスケーリングポリシーを紐づけます。CPU使用率が70%以上になったらインスタンスを1台増やし、30%以下になったら1台減るような構成にします。
![スクリーンショット 2021-06-22 14.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790886/e1a7f205-5a81-a43a-3cee-1f6184cda20b.png)



# 実施手順

## 起動テンプレートを作成
##### 起動テンプレートとは、通常手動で作成していたEC2の設定などをひとまとめにしたものです。
1. EC2の画面左メニューから`テンプレートの起動`を選択
1. `起動テンプレートを作成`を選択
1. `起動テンプレート名`を入力（例. LaunchTemplate1)
1. `テンプレートバージョンの説明`を入力（例. 1.0.0)
1. `EC2 Auto Scaling で使用できるテンプレートをセットアップする際に役立つガイダンスを提供`にチェックをつける。
1. `AMI`は前回作成した`自分のAMI`の中から指定
1. `インスタンスタイプ`は`t2.micro`を選択
1. `キーペア`は既に作成してあるものを選択
1. `リソースタグ`の`タグの追加`を選択
1. `キー`に`Name`、`値`に`WebServer-Auto`と入力（この起動テンプレートを元にEC2インスタンスが立ち上がった際にここで設定した値が付与される）
1. `ネットワークインターフェースを追加`を選択
1. `セキュリティグループ`はインスタンスに紐づいているものを選択
1. `パブリック IP の自動割り当て`は`有効化`を選択
1. `起動テンプレートを作成`を選択

## Auto Scalingグループを作成
1.EC2の画面左メニューから`Auto Scalingグループ`を選択
2.`Auto Scaling グループ名`を入力（例. Test-AutoScaling1)
3.`起動テンプレート`は先ほど作成したものを選択
4.`バージョン`は`Latest(2)`を選択し、次へ
5.`VPC`は作成したVPC、`サブネット`はパブリックのものを2つ選択し、次へ
6.`ロードバランシング`：`既存のロードバランサーにアタッチ`を選択し、前回作成したターゲットグループを作成
7.`ヘルスチェックのタイプ`：`ELB`にチェックを入れて次へ
8.`希望する容量`を`2`、 `最小キャパシティ`を`2`、`最大キャパシティ`を`4`に設定し次へ
9.通知を設定できるが、今回は飛ばして次へ
10.タグに関しても飛ばして次へ
11.問題がなければ`Auto Scalingグループを作成`を選択
12.インスタンスの画面に移動し、新たに2台インスタンスが立ち上がっていることを確認
13.ブラウザでブログが閲覧できることを確認する。

## CloudWatchでアラームを設定する
1. CloudWatchの画面を開き、左メニューの`アラーム`を選択
1. `アラームの作成`を選択
1. `メトリクスの選択`を選択
1. `メトリクス`から`EC2`を選択、`Auto Scaling グループ別`と進む。
1. 先ほど作成したAuto Scalingグループの中から`メトリクス名`が`CPUUtilization`のものを選択
1. `メトリクスの選択`を選択
1. `条件`の中の`CPUUtilization が次の時...`は`より大きい`を選択、`... よりも`の値は`70`に設定
1. `その他の設定`タブを開き、`欠落データの処理`の項目は`欠落データを不正（しきい値を超えている）として処理`を選択、次へ進む。
1. `SNS トピックの選択`の項目は既存のものが無ければ新たに作成し、次へ
1. `アラーム名`を入力して次に進む。（例. CPU_High）
1. 設定に問題が無ければ`アラームの作成`を選択
1. 上記と同じようにCPU使用率が30%以下の場合のアラームも続けて作成する。

## アラームとスケーリングポリシーを紐づける

1. Auto Scalingの画面に移り、先ほど作成したAuto Scalingグループを選択
1. `自動スケーリング`タブを選択し、`ポリシーを追加（Create dynamic scaling policy）`を選択
1. `ポリシータイプ`は`シンプルなスケーリング`を選択
1. `スケーリングポリシー名`を入力（例. CPU_add）
1. `Cloud Watchアラーム`は先ほどの`CPU_High`を選択
1. `アクションを実行`は`追加`、`1`、`キャパシティユニット`を選択
1. `別のスケーリングアクティビティを許可するまでの秒数`は`30`とし、`作成`を選択
1. 同じ要領でインスタンスを減らすポリシーも作成する。

## 機能を確認する
##### EC2インスタンスに手動で負荷をかけ、Auto ScalingとCloud Watchの機能を確認します。
1. インスタンスの画面に移り、`WebServer-Auto`のインスタンスを選択し、`接続`を選択
1. 右下の`接続`を選択するとブラウザでターミナルの画面が開く。
1. 負荷をかけるコマンド`yes >> /dev/null &`を4回程度実行する。
1. `top`コマンドを実行し、CPU使用率が高くなっていることを確認する。
1. もう一方の`WebServer-Auto`のインスタンスでも同様の手順を行う。
1. Cloud Watchの画面に移り、左のメニューから`メトリクス`を選択
1. 作成したAuto Scalingの`CPUUtilization`を選択し、画面上部のグラフでCPU使用率が上昇するまで数分待つ。
1. 左のメニューから`アラーム`を選択し、`CPU_High`が`アラーム状態`となっていることを確認する。
1. EC2の画面に移り、Auto Scalingが発動して、インスタンスが新たに起動していることを確認する。
1. ブラウザのターミナルに戻り、`top`コマンドでプロセス番号を確認し、`kill　プロセス番号`を実行、バックグラウンドで動いているプロセスを停止させる。（`kill {4060..4061}`とするとまとめて削除できる）
1. もう一方のインスタンスも同様の処理を行う。
1. 再びCloudWatchのアラームを確認し、CPU利用率が下がるのを待つ。
1. しばらく待つとEC2インスタンスの画面でも最大4台起動していたインスタンスが2つになっていることが確認できる。

## 最後に
インスタンスを終了するだけだと、Auto Scalingの機能で再びインスタンスが立ち上がってしまうので、Auto Scalingを削除した後にインスタンスを終了してください。