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配下に登録するとこまでを確認したいと思います。

前提条件

  • 起動させたい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]で作成することは可能です。
若干料金が変わるようです。

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

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

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

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

VPCは任意のものに変更します。
アベイライリティゾーン毎にSubnetを1つ選択してください。
タグは任意です。

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

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

インバウンド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できちゃいます。
簡単ですね。
かなり長文となってしまいました。
もっとスマートに書けるよう、何回かに分けたりした方がいいですね。