本稿ではAuto Scalingにアタッチされたインスタンスがメンテナンス対象となり、そのインスタンスを終了させたくない場合などの対応手順と注意点をいくつか記録しておきたいと思います。メンテナンス対応は、EC2の停止・開始をすれば終わりなはずですが、Auto Scalingにアタッチされたインスタンスを終了させたくないとすると落とし穴があります。
前置き:Auto Scalingのスケールイン保護設定や、インスタンスの終了保護や停止保護が必ずしも有効になるわけではない。
Auto Scalingに終了させたくないインスタンスがアタッチされている場合、基本的にはスケールイン保護を設定するはずです。その他、インスタンスに終了保護・停止保護設定をするケースもあると思います。しかし、これらは常に最優先される設定ではありません。つまり、それらを設定していても、終了してしまう可能性があります。
例えば、インスタンスがヘルスチェックに失敗した場合のヘルスチェックの置換などです。どういう条件の時に気をつけなければならないかなど、詳細は以下のドキュメントに譲ります。
- インスタンススケールイン保護を使用してインスタンスの終了を制御する – Amazon EC2 Auto Scaling https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html
- インスタンスに対する停止保護を有効にする – Amazon Elastic Compute Cloud https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-stop-protection.html
終了させたくないインスタンスがAuto Scalingにアタッチされている時どう対応するか?
大まかには以下のプロセスで作業をします。AWS CLIコマンドはAuto ScalingGroupに3台アタッチされている状態を想定したコマンドとします。
1. Auto Scalingのキャパシティを変更する
aws autoscaling update-auto-scaling-group --auto-scaling-group-name xxxxxxxxxxxxxx --min-size 2 --max-size 3 --desired-capacity 3
2. Auto Scalingからインスタンスをデタッチをする
aws autoscaling detach-instances --instance-ids i-xxxxxxxxxxxxxx --auto-scaling-group-name test-auto-scaling-group --should-decrement-desired-capacity
Auto ScalingGroupからデタッチするために、まずはAuto ScalingGroupの最小キャパシティを変更しています。先にキャパシティを変更せずにデタッチしようとするとplease update the AutoScalingGroup sizes appropriately.
とエラーが出ます。
また、今回はshould-decrement-desired-capacity
というオプションをつけています。これをつけないと、desired-capacity(希望キャパシティ)は元の台数を維持したままインスタンスをデタッチすることになります。
3. インスタンスの停止
aws ec2 stop-instances --instance-ids i-xxxxxxxxxxxxxx
4. インスタンスの開始
aws ec2 start-instances --instance-ids i-xxxxxxxxxxxxxx
5. 再度Auto Scalingにアタッチをする
aws autoscaling attach-instances --instance-ids i-xxxxxxxxxxxxxx --auto-scaling-group-name my-auto-scaling-group
6. Auto Scalingのキャパシティを元に戻す
aws autoscaling update-auto-scaling-group --auto-scaling-group-name test-auto-scaling-group --min-size 3 --max-size 3 --desired-capacity 3
なお、Auto ScalingGroupのロードバランシングにロードバランサーが設定されている場合、Auto Scalingにインスタンスをデタッチ・アタッチすると自動的にロードバランサー(ターゲットグループ)からのデタッチ・アタッチがされます。
また、この他に必要であればスケールイン保護設定などをします。
今回はひとつの例としてコマンドを提示しましたが、スケールイン保護が有効にならない条件などがありますので、作業が固まったら必要に応じてその環境に応じた検証していく必要があります。