#はじめに
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で完成です。まぁ簡単。
- ELB->ターゲットグループを作成する
- ELB->ロードバランサー(ALB)を作成する
- 起動する元となるAMIを準備する
- AutoScaling->起動設定を作成する
- 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できちゃいます。
簡単ですね。
かなり長文となってしまいました。
もっとスマートに書けるよう、何回かに分けたりした方がいいですね。