Instance Termination Policy for Your Auto Scaling Groupを調べてみた

記事タイトルとURLをコピーする

こんにちは!AWSチームの柳瀬です! 気づいたら会社の技術ブログにあまり登場していなかったのですが、#サバソニで紹介させて頂いた、社内AWS勉強会で調べたネタをこちらにも書いておこうと思います。 AWSでELBを使ってる方にはAuto Scalingを使ってる方もいると思います。 トリガーを設定してインスタンスを増やしたり、負荷が落ち着くと台数を減らしたり出来ます。 そんなAuto Scalingは少し前に新しいリリースがありました。 具体的にはAuto Scalingでスケールインが実行される時に、Terminateするインスタンスを自分で設定する事が出来るようになりました。 後述しますが、Auto Scalingでスケールインする時にTerminateするインスタンスは、デフォルト設定でもきちんとしたルールに基いて選択されています。 以下はデフォルトのルールと、どのようにカスタマイズが出来るかを調べたものです。 こちらの元記事を自分なりにまとめたものです。 ※きちんとした翻訳ではないので、ご注意下さい。

Auto ScalingのTermination Policy概要

トピック

  • デフォルトのTermination Policy
  • 自作のTermination Policyの動作
  • Termination Policyの構成方法

Auto Scalingはスケーリングやインスタンスの障害時に、自動的にインスタンスの起動や停止をします。 具体的にはAZのバランスや、正しい台数を維持するため、またはバッチ処理などで使われたりもします。 Auto Scalingはインスタンスを起動するためにAuto Scaling GroupにひもづけられるLaunch Configrationを使用します。 基本的な設定の仕方はAuto Scalingの基本シナリオを参照して下さい。 AutoScalingはインスタンスをTerminateする際にTermination Policyを使いますが、これはデフォルトのものを使うことも出来ますし、カスタマイズする事も可能です。 まず、大前提としてAuto ScalingはインスタンスをTerminateする際に、他のAZよりも多くインスタンスが起動していないかを識別します。 各AZで同数のインスタンスが稼働していればランダムにAZを選択して、Teminateするインスタンスを選ぶためにTermination Policyを使用します。

デフォルトのTermination Policyのしくみ

デフォルトのTermination PolicyはTerminateするインスタンスを選択する為に以下のステップを使用します。

ステップ1.

選択されたAZ内で一番古いLaunch Configを使用して起動されたインスタンスを選択します。 Auto ScalingはDescribe Launch Configurationを呼び出して一番古いLaunch Configを特定します。 一番古いLaunch Configurationを特定するためにはCreated Timeフィールドを使用しています。

ステップ2.

一番古いLaunch Configurationで複数のインスタンスが起動されていた場合は、次の課金タイミングに最も近いものをTerminateします。 ※EC2インスタンスが一時間単位で課金が発生する事もあり、このような処理が入ってるようです。

ステップ3.

複数のインスタンスが、次の課金タイミングに同じく近い場合はその中からランダムにTerminateするインスタンスを選択します。

自分用のTermination Policyの仕組み

Auto ScalingはデフォルトのTermination Policyが要件を満たさないために、Termination Policyを複数用意しています。 自作のTermination Policyを作成して使う事も出来ますし、そうでない場合はデフォルトのPolicyが使われます。 Auto Scalingは以下のTermination Policyを選択する事ができ、これらのオプションを一つ以上を選択する事が出来ます。

・OldestInstance

Auto Scaling Group内の最も古いインスタンスを削除する場合に使います。 Auto Scalingは最も古いインスタンスを特定するためにインスタンスの起動時間を使用しています。

・NewestInstance

最も新しいインスタンスを削除する場合はこれを使います。 Auto Scalingは最も新しいインスタンスを特定するためにインスタンスの起動時間を使用しています。 ・OldestLaunchConfiguration 最も古いLaunch Configurationを使用して起動されたインスタンスを削除する場合に使います。 Auto ScalingはDescribe Launch Configurationアクションを使用してインスタンスを特定します。 そして、最も古いLaunch Configurationを特定するためにCreated Timeフィールドを使用します。 ・ClosestToNextInstanceHour 次の課金タイミングに最も近いインスタンスを削除する場合はこれを使用します。 次の課金タイミングが最も近いインスタンスを削除する事で、請求を最小限に抑えつつインスタンスの実行時間を最大化します。 ・Default デフォルトのTermination Policyを使用する場合はこれを使います。 Termination Policyを設定する場合はスタンドアロンで一つのポリシーを設定したり、順序付けて複数のポリシーを指定します。 注意 もしポリシーにDefaultを使用する場合は、ポリシーリストの最後に設定して下さい。 Terminantion Policyは削除するインスタンスを特定するために、以下のステップを使用しています。 1. 選択されたAZ内では、指定されたTermination Policyにマッチするインスタンスを特定します 2. 複数インスタンスが指定したポリシーにマッチした場合は、次にリストされたポリシーを使用します 3. 指定するポリシーがない場合はDefaultを使用します

Terminaton Policyの設定

  • QueryAPIを使用した方法(今回は割愛しております)
  • コマンドラインインターフェースを使用した方法

自作のTermination Policyを割り当ててAuto Scaling Groupを作成する事も、自作のTermination Policyを使用するようにAuto Scaling Groupを更新する事も出来ます。 もし、Auto Scaling Groupを更新した場合は、次のスケール時に新しいTermination Policyで実行されます。 このセクションでは自分用のAuto Scaling GroupのTermination Policyを構成するプロセスを示していきます。 最初に新しいLaunch Configurationを作成するところから始めます。そして、自作のTermination Policyが割り当たった新しいAuto Scaling groupを作成します。 その代わりに既存のAuto Scaling Groupを更新したい場合は、新しいLaunch ConfigurationとAuto Scaling Groupを作成する最初のステップは省略する事が出来ます。 次の表はTerminaion Policyを設定するための概要を示しています。 これはAuto Scalingコマンドラインインターフェース(CLI)またはAuto Scaling Query APIのいずれかを使用してTermination Policyを構成するための手順です。

ステップ説明
ステップ①1.1 Launch Configurationを作成します
1.2 インスタンス削除時に使用するTermination Policyを指定してAuto Scaling Groupを作成します
1.3 Auto Scaling Groupがすでにある場合は、使用したいTermination Policyを指定してAuto Scaling Groupを更新します
ステップ②Auto Scaling GroupにTermination Policyが正しく設定されているか確認をします
ステップ③Auto Scaling Groupのインスタンスが指定したTermination Policyで正しく削除されるか動作確認をします
ステップ④テストに使用したAuto Scalig Groupなどのリソースを削除します

コマンドラインインターフェースを使用した設定

最新のAuto Scalingコマンドラインインターフェース(CLI)をインストールしていない場合は、Auto Scalingコマンドラインツールのページからダウンロードして下さい。 インストールとAuto ScalingのCLIを使用する手順については、Auto Scaling Developerガイドのコマンドラインツールの使用を参照して下さい。 Auto Scalig Groupに設定する自作のTerminationPolicyを設定するためには、次のAuto Scaligコマンドを使用します。

コマンド説明
as-create-launch-config起動するAMIやインスタンスタイプを指定して新しいLaunch Configurationを作成します。
as-create-auto-scaling-groupLaunch ConfigurationやTermination Policyを指定して新しいAuto Scaling Groupを作成します。
as-describe-auto-scaling-groups既存のAuto Scaling Groupを表示します。
as-update-auto-scaling-group既存のAuto Scaling Groupを更新します。
as-delete-auto-scaling-groupグループに所属するインスタンスがなくスケーリングが実行されていなければ、指定したAuto Scaling Groupを削除します。

その他一般的なコマンドの使い方はこちらを参照して下さい。 Auto Scalingに関する詳細な構文は--helpオプションやAuto Scalingクイックリファレンスカードを参照して下さい。

①Auto Scaling Groupを作成/更新します

すでに自作のTermination Policyを使用するようにAuto Scaling Groupを設定している場合はステップ①-cに進んで下さい。
a. Launch Configurationの作成
Launch ConfigurationやAuto ScalingGroupの作成する方法に慣れていない場合は、Auto Scalingにおける基本シナリオの手順を踏むことをオススメします。 基本シナリオはAuto Scalingで必要とされる一般的なインフラストラクチャを使用しています。 as-create-launchコマンドに指定する値として以下のものを使用します。

  • Launch Configuration Name
    • lc-test-termination-policy
  • Image ID
    • ami-0078da69
  • Instance Type
    • m1.small

コマンドは次のようになります。

$ as-create-launch-config lc-test-termination-policy --image-id ami-0078da69 --instance-type m1.small

実行結果は次のようになります

OK-Created launch config


b. Auto Scaling Groupの作成
as-create-auto-scaling-groupコマンドと、先ほど作成したLaunch Configurationを指定する事でAutoScalingGroupを作成出来ます。 as-create-auto-scaling-groupコマンドのその他構文についてはCreate an Auto Scaling Groupを参照して下さい。 as-create-auto-scaling-groupコマンドに指定する値として以下のものを使用します。

  • Auto Scaling Group Name
    • asg-test-termination-policy
  • Launch Configuration Name
    • lc-test-termination-policy
  • Availability Zone
    • us-east-1e
  • Max Size
    • 3
  • Desired capacity
    • 2
  • Min Size
    • 1
  • Termination Policy
    • OldestInstance

コマンドは次のようになります。

$ as-create-auto-scaling-group asg-test-termination-policy
--launch-configuration lc-test-termination-policy
--availability-zones "us-east-1e"
--max-size 3
--min-size 1
–desired-capacity 2
-–termination-policies "OldestInstance"

実行結果は次のようになります。

OK-Created AutoScalingGroup

次のステップは省略して、手順②自作したTermination Policyを設定したAuto Scaling Groupでインスタンスの起動確認に進みます c. Auto Scaling Groupの更新 as-update-auto-scaling-groupコマンドに指定する値として以下のものを使用します。

  • Auto Scaling Group Name
    • 自分のAuto Scaling Group Nameを指定して下さい
  • Termination Policy
    • OldestInstance

コマンドは次のようになります。

$ as-update-auto-scaling-group "your Auto Scaling group name" --termination-policies "OldestInstance"

実行結果は次のようになります

OK-Updated AutoScalingGroup

②作成したAuto Scaling Groupでインスタンスの起動確認

自作したTermination Policyを設定したAuto Scaling Groupと、起動したインスタンスを確認するにはas-describe-auto-scaling-groupsコマンドを使います。 このコマンドはAuto Scaling Groupと起動したインスタンスの詳細を表示します。 as-describe-auto-scaling-groupsコマンドの情報はCreate an Auto Scaling Groupを参照して下さい。 as-describe-auto-scaling-groupsコマンドに指定する値として以下のものを使用します。

  • Auto Scaling group Name
    • asg-test-termination-policy

注意 もしご自身のAuto Scaling Groupを使用する場合はチュートリアルの最後までAuto Scalig Name(asg-test-termination-policy)をご自身のAuto Scaling Nameに、Desired Capacityをご自身の値に置き換えて進めて下さい。 コマンドは次のようになります。

$ as-describe-auto-scaling-groups asg-test-termination-policy asg-test-termination-policy --headers

※ポイント --headersオプションは列ヘッダを表示してdescribeコマンドの情報を整理するオプションです。 実行した結果得られる情報は以下のようになります。

AUTO-SCALING-GROUP  GROUP-NAME  LAUNCH-CONFIG             AVAILABILITY-ZONES  MIN-SIZE  MAX-SIZE  DESIRED-CAPACITY  TERMINATION-POLICIES
AUTO-SCALING-GROUP  asg-test-termination-policy  lc-test-termination-policy   us-east-1e   1     3     2            OldestInstance
INSTANCE  INSTANCE-ID  AVAILABILITY-ZONE  STATE      STATUS   LAUNCH-CONFIG
INSTANCE  i-bd9e84c6  us-east-1e  InService    Healthy  lc-test-termination-policy
INSTANCE  i-bf9e84c4  us-east-1e  InService    Healthy  lc-test-termination-policy

Auto ScalingがLaunch Configuration(lc-test-termination-policy)を使用して2つのインスタンスを起動した事が確認出来ます。 そして2つのインスタンスは正常な状態(Healty/InService)にあります。 作成したAuto Scaling Groupには自作したTermination Policyが割り当てられています。

③自作したTermination Policyでインスタンスが削除されるかテスト

インスタンスが自作したTermination Policyで削除されるかをテストするために、最初にAuto Scalingでスケールアウトを実行させ、そのあと先ほど作成したTermination Policy(OldestInstance)を使用したスケールインを実行させます。 a. スケールアウトが実行されるようにAuto Scaling GroupのDesired Capacityを増やします as-update-auto-scaling-groupコマンドに指定する値として以下のものを使用します。

  • Auto Scaling Group Name
    • asg-test-termination-policy
  • Desired Capacity
    • 3

コマンドは次のようになります。

$ as-update-auto-scaling-group asg-test-termination-policy –-desired-capacity 3

実行結果は次のようになります。

OK-Updated AutoScalingGroup

b. Auto Scaling GroupがDesired Capacityに従いスケールアウトさせたかを確認しますコマンドは次のようになります。

$ as-describe-auto-scaling-groups asg-test-termination-policy --headers

実行した結果得られる情報は以下のようになります。

AUTO-SCALING-GROUP  GROUP-NAME  LAUNCH-CONFIG             AVAILABILITY-ZONES  MIN-SIZE  MAX-SIZE  DESIRED-CAPACITY  TERMINATION-POLICIES
AUTO-SCALING-GROUP  asg-test-termination-policy  lc-test-termination-policy   us-east-1e   1     3     3              NewestInstance
INSTANCE  INSTANCE-ID  AVAILABILITY-ZONE  STATE      STATUS   LAUNCH-CONFIG
INSTANCE  i-bd9e84c6   us-east-1e  InService    Healthy  lc-test-termination-policy
INSTANCE  i- bf9e84c4  us-east-1e  InService    Healthy  lc-test-termination-policy
INSTANCE  i-47b5af3c  us-east-1e  InService     Healthy  lc-test-termination-policy

AutoScaling Groupは新しいインスタンスi-47b5af3cを開始しました。新しく起動したインスタンスのインスタンスIDをメモしておいて下さい。 次のステップでスケーリングを確認するために使用します。
c. 自作したTermination Policyが動作するかテストするためにAutoScalingGroupを更新します
Desirec Capacityの値を減らすことでAuto Scaling Groupのスケールインを実行させます。 as-update-auto-scaling-groupコマンドに指定する値として、以下のものを使用します。

  • Auto Scaling group Name
    • asg-test-termination-policy
  • Desired Capacity
    • 2

コマンドは次のようになります。

$ as-update-auto-scaling-group asg-test-termination-policy –-desired-capacity 2

実行結果は次のようになります。

OK-Updated AutoScalingGroup

d. Auto Scaling GroupがDesired Capacityにスケールインする事を確認します このステップでは自作したTermination Policyが割り当てられたAutoScaling Groupでスケールインが実行された事を確認します。 コマンドは次のようになります。

$ as-describe-auto-scaling-groups asg-test-termination-policy --headers

実行した結果得られる情報は以下のようになります。

AUTO-SCALING-GROUP  GROUP-NAME  LAUNCH-CONFIG             AVAILABILITY-ZONES  MIN-SIZE  MAX-SIZE  DESIRED-CAPACITY  TERMINATION-POLICIES
AUTO-SCALING-GROUP  asg-test-termination-policy  lc-test-termination-policy   us-east-1e   1     3     2
OldestInstance
INSTANCE  INSTANCE-ID  AVAILABILITY-ZONE  STATE      STATUS   LAUNCH-CONFIG
INSTANCE  i- bf9e84c4  us-east-1e  Terminating  Healthy lc-test-termination-policy
INSTANCE  i-bd9e84c6   us-east-1e  InService    Healthy lc-test-termination-policy
INSTANCE  i-47b5af3c  us-east-1e  InService    Healthy  lc-test-termination-policy

コマンドの実行結果ではインスタスi-bf9e84c4を削除している事が示されています。 このインスタンスはステップ①でAuto Scaling Groupが作成された時にi-bd9e84c6とともに起動されました。 Auto Scaling Groupは削除するインスタンスを決める上でTermination Policyで指定されたOldestInstanceに従いましたが、基準を満たすインスタンスが複数存在しました。 さらに他にポリシーが存在しませんでしたので、デフォルトのポリシーで削除を行いました。 デフォルトのTermination Policyに従い、両方のインスタンスが同じLaunch Configを使用して起動され、次の課金タイミングの近さも同じでした。 そのため、Auto Scalingは削除するインスタンスをランダムに選択してi-bf9e84c4を選択しました。 e. Auto Scaling GroupのTermination Policyを変更して新しいポリシーで指定したインスタンスを削除する。 Desired Capacityを減らす事によってAuto Scaling Group内のインスタンスを削除する事が出来ます。 Desired Capacityを減らし、AutoScaling GroupのTermination Policyを変更するためにas-update-auto-scaling-policyコマンドを使います。

  • Auto Scaling group Name
    • asg-test-termination-policy
  • Desired capacity
    • 1
  • Termination Policy
    • NewestInstance

コマンドは次のようになります。

$ as-update-auto-scaling-group asg-test-termination-policy –-desired-capacity 1  --termination-policies "NewestInstance"

実行結果は次のようになります。

OK-Updated AutoScalingGroup

f. 新しいTermination Policyを使用してAuto Scaling GroupがDesired Capacityで設定した値に縮小する事を確認します。 このステップでは新しいTermination Policyを使うAuto Scaling Groupにおいてスケールインが実行された事を確認します。コマンドは次のようになります。

as-describe-auto-scaling-groups asg-test-termination-policy --headers

実行した結果得られる情報は以下のようになります。

AUTO-SCALING-GROUP  GROUP-NAME  LAUNCH-CONFIG             AVAILABILITY-ZONES  MIN-SIZE  MAX-SIZE  DESIRED-CAPACITY  TERMINATION-POLICIES
AUTO-SCALING-GROUP  asg-test-termination-policy  lc-test-termination-policy   us-east-1e   1     3     1
NewestInstance
INSTANCE  INSTANCE-ID  AVAILABILITY-ZONE  STATE      STATUS   LAUNCH-CONFIG
INSTANCE  i-bd9e84c6   us-east-1e  InService    Healthy
lc-test-termination-policy
INSTANCE  i-47b5af3c  us-east-1e  Terminating   Healthy  lc-test-termination-policy

コマンドの実行結果は新しいインスタンスi-47b5af3cが削除された事を示しています。 ※ポイント 削除されたインスタンスは③-eでAuto Scaling Groupを更新した時に起動されたもので、最も新しいインスタンスとなります。

④ 削除

作成したAuto Scaling Groupがすでに稼働しており、それをそのまま使う場合はこのステップを省略して下さい。代わりにas-update-auto-scaling-groupsコマンドを使い、Auto Scaling Groupのパラメータを設定したい値にカスタマイズして下さい。 インスタンスの利用が完了し、Termination Policyのテストが完了したら、忘れずに削除して下さい。 as-delete-auto-scaling-groupコマンドを--force-deleteオプションを使用して削除します。 このオプションはAuto Scaling Groupと共に属している起動状態のインスタンスも削除する事が出来ます。 もし--force-deleteオプションを指定しなかった場合は、Auto Scaling Groupに属するインスタンスを削除するまでAuto Scaling Groupを削除出来ません。 as-delete-auto-scaling-groupコマンドに指定する値として以下のものを使用します。

  • Auto Scaling group名
    • asg-test-termination-policy
  • Force delete (optional parameter)
    • --force-delete

コマンドは次のようになります。

as-delete-auto-scaling-group as-test-termination-policy --force-delete

Auto Scaling Groupを削除する確認を行います。 確認に回答した後、Auto Scaling Groupは次のように削除されます。

Are you sure you want to delete this AutoScalingGroup? [Ny]
OK-Deleted AutoScalingGroup

これで新しい2つのTermination Policyを作成し、それを使用してスケーリングを行い、Termination Policyのテストを完了する事が出来ました。

まとめ

こちらのドキュメントを読んでいて面白かった事はTermination Policyのデフォルト動作として課金が意識された動きが含まれている事です。 クラウドの特徴としてスケーラブルである事と、従量課金があると思います。 ユーザーは課金される費用を最大限に活かしたいと思いますが、デフォルトでそのような動作をしてくれる仕組みが含まれているところが素敵だなと感じました:)