Amazon Auto Scalingの Desired Capacity を理解する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。げんしけん 二代目の伍(14)、波戸くんが煮詰まってきていい感じですね、次巻の展開に期待!!

さて、今回はAWSで最もわかりやすくElasticしてくれる(?)機能としてお馴染みの、Auto Scalingの上級編な話題です。

ここがムズいよAuto Scaling

AWSのAuto Scalingは、EC2インスタンスを自動でCreate/Terminateする機能として負荷分散や可用性向上のためによく使われる機能です。
しかし、Management Consoleでは作成できなかったり、使うために必要な設定が比較的多かったりと、敷居が高い印象があります(実際はそんなことないんですけどね)。

autoscaling01 Auto Scalingでインスタンス数を設定するパラメータは3つ、Min Size(最小数)/Max Size(最大数)/Desired Capacity(今回の話題)があります。AWS CLIのコマンドでの実行例を示します。

[ec2-user@ip-X-X-X-X ~]$ aws autoscaling create-auto-scaling-group ¥ 
--launch-configuration-name lc1 --auto-scalingroup-name asg1 ¥ 
--min-size 1 --max-size 8 --desired-capacity 4 ¥ 
--region ap-southeast-1 --load-balancer-names auto-scaling-test ¥ 
--availability-zones ap-southeast-1a ap-southeast-1b 
{
	"ResponseMetadata": {
		"RequestId": "fb830610-dcdc-11e2-9630-cbb88f45fefd"
	}
}
[ec2-user@ip-X-X-X-X ~]$

Auto Scaling Group(Auto Scalingで管理するEC2インスタンスの集合)を作成した直後は、このDesired Capacityの数だけ、インスタンスが作成されます(上記の例だと4台)。Apacheのpreforkで言うStartServersのイメージが近いと思います。でも、そのあとのDesired Capacityはどう評価されるのでしょうか?実はよくわからないという方が多そう & 私がそうだったので、ちょっと調べてみました。

Desired Capacityが謎な理由

Desired Capacity、直訳すると"望ましい容量"です。なんともぼんやりした印象がありますが、Auto Scalingではその名前を地でいくように、設定によってはたらきが変わるんです( ! )これが、Desired Capacityが謎めいたものに見える原因なんじゃないかと思います。

では、整理しましょう。

まず分けて考えなればならないのは、Auto Scalingのタイプの違いです。以下の3タイプが設定でき、Desired Capacityは、そのタイプによってはたらきが変わります。

タイプ 説明 設定方法
固定(Fixed) 残り2つのタイプに対応するアクション/ポリシーを設定しないときのデフォルトのタイプ。Desired Capacityで動作するべきインスタンス数を指定し、自動では台数が変化しない AWS CLIのaws autoscaling set-desired-capacityコマンドなど
時間(Scheduled) 時間や周期によって動作するべきインスタンス数をDesired Capacityで指定、自動で変化させる設定。 AWS CLIのaws autoscaling put-scheduled-update-group-actionコマンドなど
動的(On Demand) 負荷の状況やヘルスチェックによってインスタンスを監視し、Auto Scalingがインスタンス数を増減させる設定。設定内容によって、Desired Capacityのはたらきが異なる。 AWS CLIのaws autoscaling put-scaling-policyコマンドなど

こうして見ると、固定タイプと時間タイプでは、Desired Capacityの設定はわかりやすいですね。
で、難しいのは動的の場合です。

動的(On Demand)でのDesired Capacityのはたらき

動的では、"何台ずつ"増減するかをScaling Policyとして定義します。Scaling Policyでは、増減する台数の算出方法としてAdjustment Typeを指定します。このAdjustment Typeによって、Desired Capacityの扱いが変化します。

Adjustment Type 意味 Desired Capacityの扱い
ChangeInCapacity 相対的に加減するインスタンス数 動作に影響なし
ExactCapacity 絶対的なインスタンス数 動作に影響なし
PercentChangeInCapacity 相対的に加減するインスタンスの割合 割合から加減する台数を決めるために使用。必須

簡単な例を以下に挙げてみます。

ChangeInCapacity

単純に一回の増減数を指定する、最も一般的な設定。

例) Scaling Adjustment : 1の場合、一度に1台ずつ増加する

[ec2-user@ip-X-X-X-X ~]$ aws autoscaling put-scaling-policy ¥ 
--region ap-southeast-1 --auto-scaling-group-name asg1 ¥ 
--adjustment-type ChangeInCapacity --scaling-adjustment 1 --policy-name scale-out 
{
	"ResponseMetadata": {
		"RequestId": "e95b43d8-dce5-11e2-9a55-d3b03408260a"
	}, 
	"PolicyARN": "arn:aws:autoscaling:ap-southeast-1:748366240872:scalingPolicy:e2a3d40f-a8d0-4a0e-b11c-80c081d84d92:autoScalingGroupName/asg1:policyName/scale-out"
}

ExactCapacity

増減させた結果のインスタンス数を指定する設定。
Min/Max Sizeにあまり頼らない、台数をはっきりさせたいケースで使えるポリシーなんじゃないでしょうか。

例) Scaling Adjustment : 6の場合、インスタンスが6台になるように増減する

[ec2-user@ip-X-X-X-X ~]$ aws autoscaling put-scaling-policy ¥ 
--region ap-southeast-1 --auto-scaling-group-name asg1 ¥ 
--adjustment-type ExactCapacity --scaling-adjustment 6 --policy-name scale-out-exact
{
	"ResponseMetadata": {
		"RequestId": "0446be62-dce6-11e2-9a55-d3b03408260a"
	},
	"PolicyARN": "arn:aws:autoscaling:ap-southeast-1:748366240872:scalingPolicy:e6d9bfb4-f4bc-4c45-8c1f-1748454b3893:autoScalingGroupName/asg1:policyName/scale-out-exact"
}

PercentChangeInCapacity

Desired Capacityをパーセンテージでかけた割合だけ増減させる設定。計算結果が1未満の場合は切り上げ(0.75は1台)、それ以外の小数点以下はすべて切り捨て(1.5は1台)になります。想定するAuto Scaling GroupのDesired Capacityが変化するケース(最初は少数、後から台数が増えるなど)でも柔軟に対応できるポリシーなんじゃないでしょうか。

例) Desired Capacity : 4 / Scaling Adjustment : 50% の場合、2台増加する

[ec2-user@ip-X-X-X-X ~]$ aws autoscaling put-scaling-policy ¥ 
--region ap-southeast-1 --auto-scaling-group-name asg1 ¥ 
--adjustment-type PercentChangeInCapacity --scaling-adjustment 50 --policy-name scale-out-percent
{
	"ResponseMetadata": {
		"RequestId": "38934373-dce6-11e2-9630-cbb88f45fefd"
	},
	"PolicyARN": "arn:aws:autoscaling:ap-southeast-1:748366240872:scalingPolicy:9cfeab00-734a-4aad-9966-ee1c22953b6c:autoScalingGroupName/asg1:policyName/scale-out-percent" }

ちなみに、ChangeInCapacityとPercentChangeInCapacityは、Scale Inさせる(台数を減らす)ために負数を設定することもあります。今回の例は、いずれもScale Outで台数を増やす例だったので念のため。

まとめ

Desired Capacityは、Auto Scalingを固定、時間で設定する際に重要、動的に設定する場合は、Adjustment Typeによってはあまり影響はないということでした。個人的には、@j3tm0t0さんの以下のツイートがしっくり来ました。

ちょっとディープなAuto Scalingの世界、いかがだったでしょうか。Desired Capacityを使いこなせれば、Auto Scalingマスターの日も近い!はず。

参考文献