雑多なインフラエンジニア日記

技術ブログでっす~

ELB オートスケール設定


ELBには、サーバ負荷やELB負荷をトリガーとして、ELB配下にぶら下がるEC2
インスタンスを増減できます。
これを AutoScaling と呼びます。

通常はCloudWatch+SNSで、AutoScalingさせるのがカッコいいやり方ですが、
本稿ではAutoScalingの基本動作を理解する為、手動で AutoScaling をする
方法を書き綴ります。

前提

・オートスケール用AMIが作成済みであること(Apache自動起動ON状態)
・ELBが作成済みであること(検証用として準備)


AutoScaling設定 (as-create-launch-config)


・起動対象のAMI、インスタンスのNW、Keyなどの基本情報を設定

$ as-create-launch-config TEST \
--image-id ami-XXXXX \
--instance-type m1.small \
--group "sg-XXXXX" \
--key "keypair1" \
--region ap-northeast-1
OK-Created launch config
$


--image-id は、起動対象のAMIのIDを指定します。
--group の箇所ですが、AutoScaling時に起動されるEC2に適用する
セキュリティグループを指定します。
VPC内の場合、名前での指定は出来ないため、GroupIDを指定します。


・確認

$ as-describe-launch-configs
LAUNCH-CONFIG TEST ami-XXXXX m1.small
$



AutoScaling Groupの作成 (as-create-auto-scaling-group)


・AutoScalingの動作設定(ELB,起動条件など)

$ as-create-auto-scaling-group ASGrp-TEST \
--launch-configuration TEST \
--availability-zones=ap-northeast-1a \
--load-balancers test \
--health-check-type ELB \
--grace-period 60 \
--min-size 0 \
--max-size 4 \
--desired-capacity 0 \
--vpc-zone-identifier subnet-XXXXXX
OK-Created AutoScalingGroup
$


--launch-configuration は、上記で作成した設定名
--load-balancers は、対象のELB名
--health-check-type は、ELB (EC2も選べる)
--grace-period は、EC2起動後何秒後にELBに組み込むか
--min-size は、EC2最小起動数
--max-size は、EC2最大起動数
--desired-capacity は、EC2起動推奨台数(※)
--vpc-zone-identifier は、EC2を起動するSubnetId

--desired-capacity は、解りづらいのですが、基本min-sizeと同じにして
おけば、問題なさげです。
https://forums.aws.amazon.com/thread.jspa?threadID=55073

上記の設定例では、min-sizeもdesired-capacityも 0 にしている為、
設定投入後、EC2が自動で起動することはありません。
1以上だと、即時でEC2を起動するようです。


EC2を手動で起動する (as-set-desired-capacity)


上記までで、AMI、ELB、AutoScalingの設定が終わっているかと思います。
繰り返しとなりますが、min-sizeもdesired-capacityも0なので、何も起きない
状態です。

これを、desired-capacity の値を増やすことでELB配下のEC2を増減させます。
(あくまで手動。)

・AutoScalingからEC2は起動されていないことを確認する。
$ as-describe-auto-scaling-instances
No instances found
$

・desired-capacity を 2 に増やし、EC2を起動する。
$ as-set-desired-capacity ASGrp-TEST --desired-capacity 2
OK-Desired Capacity Set
$

・直後のステータスは、Pendingとなる。
$ as-describe-auto-scaling-instances
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a Pending HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a Pending HEALTHY TEST
$

・数分待つと、InServiceとなり、EC2が起動したことが解る。
$ as-describe-auto-scaling-instances
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
$



EC2起動対象を増やしてみる。

・2から4へ増やしてみる。
$ as-set-desired-capacity ASGrp-TEST --desired-capacity 4
OK-Desired Capacity Set
$

$ as-describe-auto-scaling-instances
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a Pending HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a Pending HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
$

$ as-describe-auto-scaling-instances
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
$

・ELBからも確認してみる。
$ elb-describe-instance-health test
INSTANCE_ID i-XXXXXXXX InService N/A N/A
INSTANCE_ID i-XXXXXXXX InService N/A N/A
INSTANCE_ID i-XXXXXXXX InService N/A N/A
INSTANCE_ID i-XXXXXXXX InService N/A N/A
$



EC2起動対象を減らしてみる。

・4から1へ減らしてみる。
$ as-set-desired-capacity ASGrp-TEST --desired-capacity 1
OK-Desired Capacity Set
$

$ as-describe-auto-scaling-instances
INSTANCE i-XXXXXXXX ASGrp-TEST ap-northeast-1a InService HEALTHY TEST
$

$ elb-describe-instance-health test
INSTANCE_ID i-XXXXXXXX InService N/A N/A
$


AutoScalingで減らしたEC2は、Terminateされますが、オプションでstopに出来る
ような気がしています。(未確認→出来ないっぽい)

ちなみ、Terminateされる順番については以下が詳しいです。
http://dev.koba206.com/?p=275


必要であれば、設定削除(順序があるので注意)

・min-size 0 にして、EC2をTerminateする。
$ as-update-auto-scaling-group ASGrp-TEST \
--min-size 0 \
--desired-capacity 0 \
--region ap-northeast-1
OK-Updated AutoScalingGroup
$

・EC2がTerminate状態になる前に以下を実行すると怒られる。。
$ as-delete-auto-scaling-group ASGrp-TEST -f --region ap-northeast-1
as-delete-auto-scaling-group: Service error: You cannot delete an AutoScalingGroup while there are scaling
activities in progress for that group.
AWSRequestId:XXXXXX

$

・なので、Terminate確認後にに削除する。
$ as-delete-auto-scaling-group ASGrp-TEST -f --region ap-northeast-1
OK-Deleted AutoScalingGroup
$

$ as-delete-launch-config TEST -f
OK-Deleted launch configuration
$



CloudWatchと連携することで、ELB配下のEC2インスタンスがヘルスチェック
異常と判断され外れた場合(または復旧)に使えます。

ただ、メンテナンスでWebサーバのApacheを再起動をしたタイミングでヘルス
チェックに拾われてしまうと、勝手にAutoScalingするのが難点かと思います。
(この辺はうまく制御出来そうな気もする。)

やはり実運用で使うなら、CloudWatch+SNSと連携させるのが普通だと思います。
(WebサーバのCPU使用率などをトリガーにAutoScalingさせる)
→ 閾値をCPU負荷80%にして、79%と80%を行ったり来たりすると何度も
スケールイン、アウトを繰り返してしまいますが、この辺も制御できそう。

当然、AutoScalingされるAMIの設定は適切な状態でないと、トラブります。


以上です。