Elastic Beanstalkから作成したインスタンスは、再起動しようと停止するとAuto ScalingによりTerminateされてしまい新規インスタンスが作られてしまいます。そんなインスタンスをTerminateしなくて済む方法を確認
方法
過去にインスタンスの再起動がしたくてサポートに問い合わせてみた時の回答
1.Terminate 処理を Suspend にします
2.インスタンスを Stop します
3.インスタンスを Start します
4.ELB で該当インスタンスは InService になることを確認します
※ELB に設定した Healthy Check 条件を満たすにも関わらず、InService にならなかった場合は、一度該当インスタンスを ELB から外し、再度登録します。その後、InService になるのを確認します
5.SetInstanceHealth にて該当インスタンスを Healthy 状態にします
6.Terminate 処理を Resume にします
1.と6.の「Terminate 処理のSuspend/Resume」がAWSのマネジメントコンソール上から見ても分からん・・・
CLIのヘルプからそれっぽいものを探してみる
Auto ScalingのSuspendとResume
Suspend and Resume Auto Scaling Process
EC2のAuto Scaling Groupsから止めたいインスタンスのグループ名を調べてから、CLIのsuspend-processesを実行する。
$ aws autoscaling suspend-processes --auto-scaling-group-name <グループ名> --scaling-processes Terminate
$ aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name <グループ名>
--省略--
SUSPENDEDPROCESSES Terminate User suspended at 2014-10-29T07:34:26Z
--省略--
$
Suspended Processes が Terminate と出ればOK(マネジメントコンソールのDetailsでも表示される)。この間はインスタンスを停止してもTerminateされない。戻すときはresume-processesを実行する
aws autoscaling resume-processes --auto-scaling-group-name <グループ名> --scaling-processes Terminate
これでterminateなしで停止できるッ!と思ったらResumeした時点でインスタンスをTerminateしてから新規にインスタンス作成し始めた・・・
と、ここまで書いて公開していたが、後日以下の実施が漏れていたことに気が付いた
5.SetInstanceHealth にて該当インスタンスを Healthy 状態にします
aws autoscaling set-instance-health --instance-id <インスタンスID> --health-status Healthy
一度手動で Stop したインスタンスは、その後 Start して正常な状態になっても Auto Scaling で自動的に Healthy になりません。
従いまして、以下のドキュメントにあります SetInstanceHealth を利用して、該当インスタンスを Healthy 状態にしてから、 Terminate を Resume する必要があります。SetInstanceHealth
http://docs.aws.amazon.com/AutoScaling/latest/APIReference/API_SetInstanceHealth.html
こういうことらしい。Resumeした時点でAuto ScalingがインスタンスをUnhealthy状態と判断してTerminateしたようだ
Suspendして再起動後にインスタンスをHealthy状態にしてからresumeを実施してみると、インスタンスはTerminateされずに起動した
EBの検証
これ入れてやった方が早いか?
AWS Elastic Beanstalk Command Line Tool
Getting Started with Eb
インストールして初期設定後にstop/startを実施
$ eb stop
Terminate environment? [y/n]: y
Stopping environment "test-env". This may take a few minutes.
--省略--
Stop of environment "test-env" has completed.
$ eb start
Starting application "test".
Some of your option settings are ignored because they don't apply to your environment type.
Waiting for environment "test-env" to launch.
--省略--
Application is available at "test-env-XXXXXXXX.elasticbeanstalk.com".
これもインスタンスは一旦Terminateしてから新規にインスタンスを作成している
結論
- Auto ScalingのTerminate処理をSuspendしている間は、インスタンスを停止してもTerminateされない
- Terminate処理をResumeすることでAuto Scalingの設定を元に戻すことができる
- インスタンスを停止させるとUnhealthy状態と判断されるので、手動でHealthy状態にする必要がある