![]()
Amazon WebserviceのAuto Scalingの設定について
黒田です。ここ二日間ずっとAmazonのAuto Scalingをいじくっていました。色々ハマったりしたのでメモとしてブログに書いておこうと思います。
はじめに
Amazon AutoScalingは大きくわけて以下の流れで設定していきます。
- LaunchConfigを設定する
- AutoScalingGroupを設定する
- ScalingPolicyを設定する
- CloudWatchの設定をする
しかし、これでは何をやっているのかが分かり難いので、以下のように整理します。
- スケール時に配置する"対象"を決める
- スケール対象を配置する"場所"を決める
- スケール時の"振る舞い"を決める
- スケールさせる"契機"を決める
そこで、本ブログでのゴールを
CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、
AMIをlargeインスタンスで、自動的にスケールアウトさせる
こととします。
以下では、上記のステップで説明していきます。
環境準備
ツール準備
Amazon AutoScaling toolをダウンロードする
以下の説明ではToolはDL後に/Applications/配下に配置しています。
$ export AWS_CREDENTIAL_FILE=/Applications/AutoScaling-1.0.39.0/credential-file-path.txt
※credential-file-path.txtには下記の証明書情報を入れて、chmodで600にしておきます。
AWSAccessKeyId=xxxxxxxxx
AWSSecretKey=xxxxxxxxx
以下のように各種パスを通します
$ export AWS_AUTO_SCALING_HOME=/Applications/AutoScaling-1.0.39.0/
$ export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin
$ export JAVA_HOME=/Library/java/Home ※Javaのパスは個人のJava環境にあわせてください。
以下のコマンドが実行できて、利用可能なコマンドの一覧が表示されれば準備完了です。
$ as-cmd
AMIの準備
AutoScalingはAMIを使ってスケールさせるため、AMIを事前に作成しておくことになる。 AMIはhttpdやtomcat等が全てサーバ起動と同時に起動するように設定しておくこと。例
chkconfig httpd onAMIを作成する。
chkconfig tomcat6 on
例:ManagementConsoleでEC2インスタンスを右クリックCreate Image(EBS AIM)押下
Load Balancerの準備
EC2のLoad Balancerを設定しておくこと。AutoScalingでは指定したEC2のロードバランサー配下でスケールアウト、スケールインが行われるため、事前に用意が必要。
基本的には通常通りの設定で問題ないが、AvailabilityZoneで xxxxx-1aとxxxxx-1b両方使ってスケールさせたい場合は、両方の使用を設定しておくこと。
(EC2タブ→左ペインのloadbalancers 押下 -> instanceタブ)
スケール時に配置する対象を決める
太字部分が対象CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、
AMIをlargeインスタンスで、自動的にスケールアウトさせる
Launch Configの設定
Launch ConfigとはどのリージョンにどのAMIをどのインスタンスタイプで配置するかという設定。つまり、AmazonWebserviceのManagementConsoleでLaunch Instanceするときにウィザードで設定していく項目と同じです。
後述しますが、LaunchConfigはリリース等でAMIを差し替えたいときに再度作成することになります。
説明
$ as-create-launch-config [LaunchConfig名(自由)] --image-id [AMIのイメージID] --instance-type [インスタンスタイプ] --region [リージョン] --group [セキュリティグループ名] --key [キーペアー名]
例 AMI(ami-xxxxxxx)をlargeインスタンスに指定 $ as-create-launch-config HBLC --image-id ami-xxxxxxx --instance-type m1.large --region ap-northeast-1 --group "web-product" --key abcdekey
スケール対象を配置する場所を決める
太字部分が対象CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、
AMIをlargeインスタンスで、自動的にスケールアウトさせる
AutoScaling Groupの設定
どのロードバランサー配下にLaunchConfigで設定したAMIを配置するかを定義する。説明
$ as-create-auto-scaling-group [AutoScalingGroup名(自由)] --launch-configuration [配置したいAMIを定義しているLaunchConfig名] --availability-zones=[配置したいAvailabilityZode名] --load-balancers [どのロードバランサーに配置するか] --max-size [スケールの最大インスタンス数] --min-size [スケールの最小インスタンス数] --region [リージョン名]
例 LaunchConfig(HBLC)で設定したAMIをロードバランサーHBLBにセットする。
$ as-create-auto-scaling-group HBAutoScalingGroup --launch-configuration HBLC --availability-zones=ap-northeast-1a, ap-northeast-1b --load-balancers HBLB --max-size 3 --min-size 1 --region ap-northeast-1
スケール時の振る舞いを決める
太字部分が対象CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、
AMIをlargeインスタンスで、自動的にスケールアウトさせる
Scaling Policyの設定
スケーリングポリシーとは、CloudWatchの監視からScalingを実行させた場合に適用するスケーリングの振る舞いを定義します。 最終的にはここで設定したポリシーとCloudWatchのアラーム(例:CPU使用率が90%以上のときAlarm)を連動させることになります。説明
$ as-put-scaling-policy [ScalingPolicy名(自由)] --auto-scaling-group [適用させるScalingGroup名] --adjustment=[スケール幅] --type [スケール幅の種類(%指定、個数指定等)] --cooldown [次回のスケールまでの待機時間] --region[<リージョン名]
例 スケールアウトさせる設定 --adjustment を +1 にしてスケールアウト
$ as-put-scaling-policy HBScaleUpPolicy --auto-scaling-group HBAutoScalingGroup --adjustment=1 --type ChangeInCapacity --cooldown 300 --region ap-northeast-1
(参考) スケールインさせる設定 --adjustment を -1 にしてスケールイン
$ as-put-scaling-policy HBScaleDownPolicy --auto-scaling-group HBAutoScalingGroup --adjustment=-1 --type ChangeInCapacity --cooldown 300 --region ap-northeast-1
スケールさせる契機を決める
太字部分が対象CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、
AMIをlargeインスタンスで、自動的にスケールアウトさせる
CloudWatchの設定
CloudWatchにて、監視条件を設定して、スケールアウト、スケールインさせたいときにアラートを発生させるように設定します。アラートに対して前に設定したScalingPolicyをセットすることが出来ます。
AutoScalingGroup内のEC2の全体のCPU使用率が90%以上が5分間続いた場合にスケールアウトさせる
CloudWatchにてCreateAlarmを押下し、以下のように選択する。
Nameは任意で付け、CPU使用率が5分間90%以上の場合という条件を設定。
TakeActionのAutoScalingPolicyを選択すると、先ほど設定したScalingPolicyが選択可能になっているので、ここでは+1スケールアウトするポリシーHBScaleUpPolicyを選択します。
これで、以下のゴールを達成できます。
CPU負荷が90%以上に達した場合に、ロードバランサー(今回はHBLBという名前)配下で、 AMIをlargeインスタンスで、自動的にスケールアウトさせる
TIPS
AutoScalingの設定中に起きたこと、気付き、あれこれ。モグラたたき祭り
作業中に一旦AutoScalingのかかったインスタンスを全て消したいと思い、ManagementConsoleからTerminateしました。すると、さすがAutoScaling。すぐにスケールアウトし設定したmin値まで復活してきます。
そこで、min-size=0でAutoScalingGroupをupdateしました。
これで大丈夫だと思いインスタンスをTerminateしました。しかし、まだインスタンスが立ち上がってしまう。モグラたたき状態。
そして、以下のようにdesired-capacityも0にしたらインスタンスを復活させずに全て消すことが出来ました。
$ as-update-auto-scaling-group HBAutoScalingGroup --launch-configuration HBLC --availability-zones=ap-northeast-1a, ap-northeast-1b --desired-capacity 0 --min-size 0 --region ap-northeast-1また、各種設定(LaunchConfig、AutoScalingGroup、AutoScalingPolicy)を全て削除したい場合、登録した順番の逆に削除しないと消せません。
AutoScaling設定内でのリリース作業
同じロードバランサー配下で、新しいAMIをリリースしたい場合について。まずは、新しいAMIでlaunch configを作ります。
as-create-launch-config HBLC20111029_1 --image-id ami-fe41f5ff --instance-type m1.large --region ap-northeast-1 --group "webserver-product" --key rbit次に、元々あるAutoScaling Groupに今つくったlaunch configをセットします。
as-update-auto-scaling-group HBAutoScalingGroup --launch-configuration HBLC20111029_1 --region ap-northeast-1ここで、LaunchConfigを差し替えても、現在のインスタンス数がmin以上であると、インスタンスは現状を維持します。つまり、新しいAMIはまだ配置されません。 そこで、1台ずつ落とすと、オートスケールが働き入れ替えたAMIが起動します。これを繰り返して入れ替えていくことにしました。(もっと良いやり方を知っている方教えて下さい!!)
ログについて
AutoScalingして、負荷等によりスケールアウトし、落ち着いて自動的にスケールインした場合、ログファイルはインスタンスもろとも消えてしまいます。シャットダウン時等にS3に退避が必要。CommandLineToolの詳細な説明
詳細は以下を確認してください。http://docs.amazonwebservices.com/AutoScaling/latest/DeveloperGuide/index.html?astools.html#UsingTheCommandLineTools
以上、参考になれば幸いです。
