AWS AutoScaling 試してみた

#はじめに
2017年にArchitecting on AWSのトレーニングを受けて、やっと先日AWS認定ソリューションアーキテクト-アソシエイトに合格しました。
勉強した内容をメモとして残しておくことを目的とします。
今回は、ちょっと苦労したAutoScaling。

#AutoScalingとは
EC2(ECSも対応しているらしい)を負荷やインスタンスの状態に応じて
自動でサーバを追加したり、削除したりしてくれる便利機能です。
【公式マニュアル】
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html

#構成
一般的なAutoScalingの構成を作成したいと思います。
ELBを立てて、その下にEC2をマルチAZ構成でぶら下げます。
そして、負荷をかけて、自動でEC2が作成され、ELB配下に登録するとこまでを確認したいと思います。

<img width="446" alt="スクリーンショット 2018-02-16 1.14.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/224712/36b7c584-3b72-f168-b297-0b805e117d30.png">


#前提条件
- 起動させたいEC2(apacheがインストールされている)インスタンスがあること
- Subnetが各AZ毎に1つあること

#構築順序
以下、5Stepで完成です。まぁ簡単。
1. ELB->ターゲットグループを作成する
2. ELB->ロードバランサー(ALB)を作成する
3. 起動する元となるAMIを準備する
4. AutoScaling->起動設定を作成する
5. AutoScaling->Auto Scaling グループを作成する

#1. ELB->ターゲットグループを作成する
ELB配下に登録するインスタンスの情報を定義します。
マネジメントコンソール画面より[EC2ダッシュボード]画面を開きます。
左ペインより[ロードバランシング]->[ターゲットグループ]を選択します。

[ターゲットグループの作成]を選択します。

EC2でHTTPサイトを立てて負荷分散させるのでHTTPを選択します。
ターゲットグループ名に任意の名前を入力します。
ターゲットの種類はEC2なので、[instance]となります。
VPCは適切なものを選択します。

| 項目 | 値 | memo |
|---|---|---|
| ターゲットグループ名 | as-target-grp01 |  |
| プロトコル | HTTP |  |
| ポート | 80 |  |
| ターゲットの種類 | instance |  |
| VPC | vpc-xxxxx | 任意のvpcを選択 |



ヘルスチェックの設定ではELBの監視プロトコルおよびパスを設定します。

| 項目 | 値 | memo |
|---|---|---|
| プロトコル | HTTP |  |
| パス | / |  |


ヘルスチェックの詳細設定では監視閾値を設定します。
ここで設定した閾値を超過するとELBの振り分け対象から除外されます。
AutoScalingとは監視設定が別ですので設計する際は検討が必要です。
※デフォルト設定とします。

| 項目 | 値 | memo |
|---|---|---|
| ポート | トラフィックポート |  |
| 正常のしきい値 | 5 |  |
| 非正常のしきい値 | 2 |  |
| タイムアウト | 5秒 |  |
| 間隔 | 30秒 |  |
| 成功コード | 200 |  |


デフォルトでは、
30秒間隔でインスタンスへポーリングを行い、
5秒応答がなかった場合、ヘルスチェクを失敗とみなす。
ヘルスチェックに2回連続して失敗した場合インスタンスを非正常とみなし
ELBの振り分け対象から除外するということになります。

入力が完了したら、[作成]を選択します。

そうするとターゲットグループが作成されます。

#2. ELB->ロードバランサー(ALB)を作成する
左ペインより[ロードバランシング]->[ロードバランサー]を選択します。
[ロードバランサーの作成]を選択します。

[Application Load Balancer]の[作成]を選択します。
HTTPを振り分けるのであればALBを使うのがAWS推奨？のようです。
[Classic Load Balancer]で作成することは可能です。
若干料金が変わるようです。
<img width="1260" alt="スクリーンショット 2018-02-16 8.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/224712/4848a7f5-fefc-8ba8-4148-68197c045a30.png">

ロードバランサーの名前に任意の名前を入力します。
インターネットへ公開するのでスキーマは[インターネット向け]を選択します。

| 項目 | 値 | memo |
|---|---|---|
| 名前 | as-elb-01 |  |
| スキーマ | インターネット向け |  |
| IPアドレスタイプ | ipv4 |  |

HTTPを振り分けるのでリスナーにHTTPが登録されていることを確認することを忘れず。

| ロードバランサーのプロトコル | ロードバランサーのポート |
|---|---|
| HTTP | 80 |

VPCは任意のものに変更します。
アベイライリティゾーン毎にSubnetを1つ選択してください。
タグは任意です。
<img width="1262" alt="スクリーンショット 2018-02-16 8.30.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/224712/eebb3091-8ec1-a23d-ac40-5100d4a266c6.png">

[次の手順: セキュリティ設定の構成]を選択します。

次の画面で警告が出ます。セキュアなプロトロルではないですよという優しさです。
[次の手順: セキュリティグループの設定]を選択します。

インバウンドHTTPを許可しているセキュリティグループを選択してください。
※なければここで作成することも可能です。
[次の手順: ルーティングの設定]を選択します。

ターゲットグループは[既存のターゲットグループ]を選択し、
先ほど作ったターゲットグループ[as-target-grp01]を選択します。
[次の手順: ターゲットの登録]を選択します。

登録済みのターゲットにインスタンスがなくてokです。
むしろあったらダメです。
AutoScaling側でインスタンス数を管理しているので
初期は0でないと意図したインスタンス数になりません。
[次の手順: 確認]を選択します。

ここで設定内容を確認し、[作成]を選択します。

これでELBの設定は完了です。やっとAuto Scalingの設定です。

#3. 起動する元となるAMIを準備する
左ペインより[インスタンス]->[インスタンス]を選択します。
元となるインスタンスにチェックを入れて、
[アクション]->[イメージ]->[イメージの作成]を選択します。

| 項目 | 値 | memo |
|---|---|---|
| イメージ名 | as-ami-01 |  |
| スキーマ | ami for auto scaling |  |
| 再起動しない | チェックなし | インスタンスが再起動する |

インスタンスボリュームはそのままにします。

[イメージの作成]を選択します。

[イメージ]->[AMI]を選択します。
作成直後は[pending]となってますので[available]になるまで数分待ちます。


#4. AutoScaling->起動設定を作成する
左ペインより[AUTO SCALING]->[起動設定]を選択します。
[Auto Scaling グループの作成]を選択します。
右下の[起動設定の作成]を選択します。

左ペインより[マイ AMI]を選択し、先ほど作成したAMI[as-ami-01]を選択します。

インスタンスタイプを選択します。
[t2.micro]で良いかと思います。
[次の手順: 詳細設定]選択します。

起動設定の名前を設定します。

| 項目 | 値 | memo |
|---|---|---|
| 名前 | as-startup-setting-01 |  |
| 購入オプション | チェックなし |  |
| IAMロール | なし | インスタンスが再起動する |
| モニタリング | チェックなし | インスタンスが再起動する |

高度な詳細設定は任意で設定してください。
特に[ユーザデータ]は起動時にサーバ設定ができるので
サーバ毎の設定が必要な場合はここから設定ができます。
今回は、ウェブページを表示した際にどこのサーバに接続したかわかるように
起動時に[index.html]にホスト名を出力させたいと思います。

[●テキストで]を選択して以下を貼り付けます。
 #!/bin/bash
 hostname > /var/www/html/index.html

[次の手順: ストレージの追加]選択します。

ストレージはそのままで[次の手順: セキュリティグループの設定]選択します。
インバウンドHTTPとSSHを許可しているセキュリティグループを指定します。

[確認]選択します。

設定を確認し、[起動設定の作成]を選択します。


#5. AutoScaling->Auto Scaling グループを作成する
続いて[Auto Scaling グループの作成]にやっと着手します。

| 項目 | 値 | memo |
|---|---|---|
| 起動設定 | as-startup-setting-01 |  |
| グループ名| as-autoscaling-grp01 |  |
| グループサイズ| 開始時 2 インスタンス |  |
| ネットワーク | vpc-xxxxx | 任意のvpcを選択 |
| サブネット | subnet-xxxxx | 2つのsubnetを選択 |

高度な詳細を以下のとおり設定します。

| 項目 | 値 | memo |
|---|---|---|
| ロードバランシング | チェックあり |  |
| Classic ロードバランサー| - |  |
| ターゲットグループ | as-target-grp01 |  |
| ヘルスチェックのタイプ | EC2 |  |
| ヘルスチェックの猶予期間 | 300秒 | |
| モニタリング | - | |
| インスタンスの保護 | - | |
| サービスにリンクされたロール | AWSServiceRoleForAutoScaling | |

[次の手順: スケーリングポリシーの設定]選択します。

次の画面で[スケーリングポリシーを使用して、このグループのキャパシティを調整する]を選択します。
すると、スケーリング範囲が選択できるようになります。
スケーリング範囲は、2および4インスタンス。としました。

その下のスケールグループサイズにてEC2の負荷状況に応じて
スケールアップさせる設定があります。
EC2のCPU使用率を監視して、50%以上になった場合、
スケールアップするという設定です。
50%より下回った場合、スケールイン(インスタンスが終了)されます。

| 項目 | 値 | memo |
|---|---|---|
| 名前 | Scale Group Size | デフォルト値 |
| メトリクスタイプ | CPUの平均使用率 |  |
| ターゲット値 | 50 |  |
| インスタンスは | 300 スケーリング後にウォームアップする秒数 |  |
| スケールインの無効化 | チェックなし |  |

[次の手順: 通知の設定]選択します。

通知の設定は必要に応じて設定してください。
[次の手順: タグを設定]選択します。

タグの設定も必要に応じて設定してください。
[確認]選択します。

設定を確認し、[Auto Scaling グループの作成]を選択します。

以上で設定は完了です。

作成完了後からAuto Scalingが動作します。
[AUTO SCALING]->[Auto Scaling グループ]で
[as-autoscaling-grp01]を選択し、[インスタンス]タブにて
インスタンスの状態が確認できます。
インスタンスが[Healthy]となったらインスタンス作成完了です。

左ペインより[ロードバランシング]->[ターゲットグループ]を選択し、
[ターゲット]タブにてインスタンスのリッスン状態を確認できます。
インスタンスの状態が[healthy]となったら接続可能です。

#Let's Connect!
左ペインより[ロードバランシング]->[ロードバランサー]を選択します。
[as-elb-01]を選択し、[DNS名]をコピーします。
ブラウザに貼り付けて、EC2のホスト名が表示されたらokです。

#まとめ
ぽちぽちとやればすぐにAuto Scalingできちゃいます。
簡単ですね。
かなり長文となってしまいました。
もっとスマートに書けるよう、何回かに分けたりした方がいいですね。