Auto ScalingのHealth Check、Scaling by Policy

Auto ScalingのHealth Check

前回は、Auto ScalingをCLIから使う基本的な方法をお伝えしましたので、今回はもうちょっと詳しくお伝えします。

まずは、Auto Scalingグループを削除する方法です。

$ as-delete-auto-scaling-group mygroup1 --region ap-northeast-1
    
    Are you sure you want to delete this AutoScalingGroup? [Ny]y
as-delete-auto-scaling-group:  Service error: You cannot delete an AutoScalingGroup while there are instances
 still in the group.  AWSRequestId:79d96c3f-c817-11e0-9095-c97d2522c411

Auto Scalingグループ内にまだインスタンスがあるから消せないと起こられます。面倒ですね。しかし、force-deleteオプション指定でまとめて消せます。

$ as-delete-auto-scaling-group mygroup1 --region ap-northeast-1 --force-delete
    
    Are you sure you want to delete this AutoScalingGroup? [Ny]y
OK-Deleted AutoScalingGroup

無事に削除することができました。改めてグループを作成します。

$ as-create-auto-scaling-group mygroup1 ¥
   --region ap-northeast-1 --availability-zones ap-northeast-1a ¥
   --launch-configuration t1config --max-size 2 --min-size 1
OK-Created AutoScalingGroup

インスタンスの健康状態

全てのインスタンスは、健康(Healthy)な状態で起動します。Auto Scalingは、外部から通知を受け取ることによって健康から不健康(Unhealthy)になります。外部というのは、Amazon EC2、Elastic Load Balancing、SetHealthStatusコマンドの3つです。全てのAuto Scalingグループは、デフォルトでAmazon EC2からの通知を受け取るように設定されています。ELBを指定することによって、Amazon EC2に加えて、ELBでも通知を受け取るようになります。インスタンスがUnhealthyになると、直ちにリプレース対象になります。

それでは、ヘルスチェック対象をELBに変えます。

$ as-update-auto-scaling-group mygroup1 --region ap-northeast-1 –-health-check-type ELB
OK-Updated AutoScalingGroup

下準備などが必要なこともあると思うので、ヘルスチェックを開始する猶予時間を設定することができます。

$ as-update-auto-scaling-group mygroup1 --region ap-northeast-1 –-grace-period 300
OK-Updated AutoScalingGroup

起動されているインスタンスを消すことでUnhealthyに変更することもできますが、コマンドラインからステータスを変更することもできます。

$ as-set-instance-health i-30d18d31 --region ap-northeast-1 --status Unhealthy
OK-Instance Health Set

実際にUnhealthyか確認します。

$ as-describe-auto-scaling-groups --region ap-northeast-1
AUTO-SCALING-GROUP  mygroup1  t1config  ap-northeast-1a  1  2  1
INSTANCE  i-30d18d31  ap-northeast-1a  Terminating  Unhealthy  t1config

猶予時間を300秒設定していましたね。5分待ちます。。。。

$ ec2-describe-instances --region ap-northeast-1
RESERVATION	r-50184c51	771293814336	default
INSTANCE	i-74d38f75	ami-300ca731	ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com	ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal	running		0		t1.micro	2011-08-16T15:24:01+0000	ap-northeast-1a	aki-d209a2d3			monitoring-enabled	XXX-XXX-XXX-XXX	XXX-XXX-XXX-XXX			ebs					paravirtual	xen	8ec63037-74bd-454c-96ea-55e6da162203	sg-06c26807	default
BLOCKDEVICE	/dev/sda1	vol-07cbcd6d	2011-08-16T15:24:22.000Z	
TAG	instance	i-74d38f75	aws:autoscaling:groupName	mygroup1

5分待ちましたので改めてグループ情報を見てみます。

$ as-describe-auto-scaling-groups --region ap-northeast-1
AUTO-SCALING-GROUP  mygroup1  t1config  ap-northeast-1a  1  2  1
INSTANCE  i-74d38f75  ap-northeast-1a  InService  Healthy  t1config

先ほど強制的にUnhealthyだったステータスが5分後にヘルスチェックによってHealthyに変更されました。ヘルスチェックの結果、スケールアウトまたはスケールインする必要がなかったのでインスタンス数に変動はありませんでした。

いろいろポリシーを作って試す

ポリシーは主に外部から呼び出させます。インスタンス数を倍にするときには、100%UPを指定をします。adjustmentは増減値を指定し、typeは方法を指定しています。

$ as-put-scaling-policy mypolicy1 --region ap-northeast-1 -g mygroup1 --name "double size" --adjustment 100 --type PercentChangeInCapacity
arn:aws:autoscaling:ap-northeast-1:771293814336:scalingPolicy:d1a04000-bcaf-458c-88ba-81f8e40a3095:autoScalingGroupName/mygroup1:policyName/double size

インスタンス数を1つ減らすポリシーを作成します。

$ as-put-scaling-policy mypolicy1 --region ap-northeast-1 -g mygroup1 --name "scale down" --adjustment=-1 --type ChangeInCapacity
arn:aws:autoscaling:ap-northeast-1:771293814336:scalingPolicy:a2bf2451-bd81-4f28-9eb3-fc301c3f00b8:autoScalingGroupName/mygroup1:policyName/scale down

同じく、インスタンス数を1つ増やすポリシーを作成します。

$ as-put-scaling-policy mypolicy1 --region ap-northeast-1 -g mygroup1 --name "scale out" --adjustment=1 --type ChangeInCapacity
arn:aws:autoscaling:ap-northeast-1:771293814336:scalingPolicy:f67f4b41-2cc3-4e7d-bcb9-995fccc1db87:autoScalingGroupName/mygroup1:policyName/scale out

それでは、インスタンス数を2倍にするポリシーをコマンドから実行してみましょう。

$ as-execute-policy mypolicy1 --name "double size" -g mygroup1 --region ap-northeast-1
OK-Executed Policy

確かにグループ内のインスタンスが2倍になりました。ちなみに、ポリシー内容を更新したい場合には同じポリシー名で作成すれば上書きされます。削除する場合には削除コマンドがあります。また、ポリシーを一時停止するには、Suspendコマンドで停止できます。これでポリシーは動作しません。再開するにはResumeコマンドが必要です。

$ as-suspend-processes mygroup1 --region ap-northeast-1
OK-Processes Suspended

グループのポリシーが一時停止されているか確認します。

$ as-describe-auto-scaling-groups --region ap-northeast-1
AUTO-SCALING-GROUP  mygroup1  t1config  ap-northeast-1a  1  2  2
INSTANCE  i-74d38f75  ap-northeast-1a  InService  Healthy  t1config
INSTANCE  i-eaca96eb  ap-northeast-1a  InService  Healthy  t1config
SUSPENDED-PROCESS  ReplaceUnhealthy   User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  AlarmNotification  User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  Launch             User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  AddToLoadBalancer  User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  AZRebalance        User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  ScheduledActions   User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  Terminate          User suspended at 2011-08-16T16:20:33Z  mygroup1
SUSPENDED-PROCESS  HealthCheck        User suspended at 2011-08-16T16:20:33Z  mygroup1

確かに一時停止しているようです。では、再開します。

$ as-resume-processes mygroup1 --region ap-northeast-1
OK-Processes Resumed

$ as-describe-auto-scaling-groups --region ap-northeast-1
AUTO-SCALING-GROUP  mygroup1  t1config  ap-northeast-1a  1  2  2
INSTANCE  i-74d38f75  ap-northeast-1a  InService  Healthy  t1config
INSTANCE  i-eaca96eb  ap-northeast-1a  InService  Healthy  t1config

先ほど、インスタンスを2倍に増やしたので、1つインスタンスを減らしてみます

$ as-execute-policy mypolicy1 --name "scale down" -g mygroup1 --region ap-northeast-1 
OK-Executed Policy

確かにインスタンスが減りました。

まとめ

前回に引き続きしつこくAuto Scalingについて使い方を解説しました。次回は、スケジュールで起動するポリシーやCloudWatch連携についてです。