AWSの特徴に、AutoScalingという機能があります。CPU使用率やネットワーク呼量に応じて、ロードバランサー配下にインスタンス(サーバー)を自動で追加する機能ですが、最近のアップデートで「ライフサイクル管理」という何やら聞き慣れない機能が追加されました。少々複雑なので、とりあえずさわりだけ。。
AutoScalingとは前述のとおりですが、例えば下記のシナリオで事が進んだ場合
(ELB = ロードバランサ) (AS = AutoScalingGroup)
1. ELB: CPU一杯、助けてー
2. AS: わかったよ、インスタンス追加するよ
3. AS: 追加したけど、起動してる間チョットまってて
4. AS: ちゃんと起動できるのに多分これぐらい時間がかかるね、じゃあこれぐらい待とう
5. AS: 多分起動できたから、ELBさん正常に動いているかチェックして
6. ELB: OK、ちゃんと起動してるね。じゃああなたにも負荷分散しますよ。
つまり、4. や 5. は 大体これぐらいかかるだろう という予測に基づいて設定するしかなかったのが、今回の新機能で、ちゃんと起動や初期化が出来たか(正確にはミドルのインストールや、データの同期処理などが主体)をきちんと管理することができるというわけです。
具体的にインスタンスが追加されるステートは
Pending
Pending:Wait <- ここで SNSやSQS が飛ぶ
Pending:Process <- 初期化が出来た場合、できましたよーと通知して、このステートに変える
OutService <- ここでチェックが通って
InService
赤文字の2つのステートが追加になりました。逆に障害発生時の切り離しにも同じようなステートが追加になりました。用途としては、Terminateする前にLogだけをどこかに退避させることが考えられます。
前置きが長くなりました、早速やります。
step 0
awscli を更新してください。1.3.25 にする必要があります。
step 1
ELBとAutoScalingGroupを作ってください。beanstalkでもいいです。
step 2
SNSの E-mail サブスクリプションを作ってください。とりあえずSNSでやります。
step 3
IAM ロールを作ってください、 ユーザーやグループで無く、ロールです。 SNSとSQNのロールが必要
step4
aws autoscaling put-lifecycle-hook \--lifecycle-hook-name ebHookLaunchTest \
--auto-scaling-group-name [AutoScalingGroupの名前] \
--lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING \
--notification-target-arn [step 2で作った arn] \
--role-arn [step3 で作った arn]
--lifecycle-transitionは Launching時の話なのか、 Terminating時の話なのかです。
http://docs.aws.amazon.com/AutoScaling/latest/APIReference/API_DescribeLifecycleHookTypes.html
--notificaiton-target-arn はどこに通知するかです。本来はSQSに行くのが王道でしょうが、サンプルなのでSNSでご勘弁
- role-arn はSNSかSQSに打つために使うロールです。くどいようですがロールです。
step5
何らかの方法で AutoScalingを発動させる。 min を上げるとか、 desireを変えるとか。。
step6
するとPending:Waitになり、メールが飛んできます。
Service: AWS Auto Scaling
Time: 2014-08-07T12:56:03.948Z
RequestId: ほげほげ
LifecycleActionToken: <ここが重要!>
AccountId: ほげほげ
AutoScalingGroupName: ほげほげ
LifecycleHookName: ほげほげ
EC2InstanceId: ほげほげ
LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING
NotificationMetadata: null
step7
初期化処理が正常終了したとして、完了メッセージを投げます
aws autoscaling complete-lifecycle-action \--lifecycle-hook-name ebHookLaunchTest \
--auto-scaling-group-name [AutoScalingGroupの名前] \
--lifecycle-action-token [メールで届いた LifecycleActionToken] \
--lifecycle-action-result CONTINUE
--lifecycle-action-tokenがSNSやSQSで届いた通知の中に入っているので、それを指します。
--lifecycle-action-result は CONTINUEは正常に終了出来たといういみで、このままELBのヘルスチェックに入ります。もしも失敗した時は ABANDONを指定し、その場合は直ちにTerminateされます。
さて、この機能をどう使うかですが、起動するEC2自体に初期化処理させることも、外部からChefなどをつかって処理させることも可能です。実用的なネタも近いうちに書いてみようと思います。本日はここまで!
参考
http://aws.typepad.com/aws_japan/2014/08/auto-scaling-update-lifecycle-standby-detach.html