読者です 読者をやめる 読者になる 読者になる

続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

AutoScalingライフサイクル管理を使ってみた

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-cli でコマンド

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