【AWS】オートスケーリングの設定を解説!(Terraform版)

autoscaling-top AWS
スポンサーリンク

今回は、オートスケーリングの設定を解説していきます。解説には、Terraformの aws_autoscaling_group を使用します。(Terraformの設定項目で説明する方が網羅的で分かりやすいかと思った次第です。)

それではいってみましょう!

スポンサーリンク

オートスケーリングの解説

項目解説設定の例
max_sizeオートスケーリンググループで起動させるEC2インスタンスの最大数。2
min_sizeオートスケーリンググループの起動させるEC2インスタンスの最小数。1
desired_capacityオートスケーリンググループで起動を維持するEC2インスタンスの数。「min_size ≦ desired_capacity ≦ max_size」である必要がある。2
availability_zonesオートスケーリンググループを配置するAZ。EC2-Classic環境でのみ使用可能。vpc_zone_identifierを使用する場合は使えないので注意。[“ap-northeast-1a”, “ap-northeast-1c”]
vpc_zone_identifierEC2インスタンスを起動させるサブネットのIDを設定する。availability_zonesを使用する場合は使えないので注意。[“XXXX”]
capacity_rebalanceスポットインスタンスを使用する場合、そのスポットインスタンスが中断されそうになると自動で置き換えを行う設定。true
default_cooldownクールダウンの秒数。デフォルトは300秒。簡易スケーリングポリシーを使用する場合に適用される。クールダウンを設定することで、EC2インスタンスが起動した際に、起動しきるの待つことができます。(「EC2の起動に時間が掛かっている時に、オートスケーリンググループがそのEC2を不正な状態だと判断して、EC2インスタンスを追加する。」のような状況を避けることが可能。)300
launch_configurationEC2の起動設定。こちらを使用せずに、launch_templateを使用することが推奨されているため、解説は省きます。
launch_templateEC2の起動テンプレート設定。ブロックで設定項目があるため、解説は後述。
mixed_instances_policyオートスケーリンググループで使用するEC2インスタンスに「オンデマンド」「スポット」の両方を使用する場合、どのように組み合わせるか?の設定。ブロックで設定項目があるため、解説は後述。
initial_lifecycle_hookライフサイクルフックの設定。ブロックで設定項目があるため、解説は後述。
health_check_grace_periodヘルスチェックの猶予期間。EC2インスタンスのステータスを確認するまでの待機時間を設定する。デフォルトは300秒。長く設定する場合は、「インスタンスが開始されてから、通信を受け取ることができるまでに時間が掛かる」場面で役に立ちます。短く設定する場合は、すぐにオートスケーリンググループにEC2インスタンスが参加するため、サービス提供できるまでの時間が短縮できます。300
health_check_typeヘルスチェックのタイプを「ELB」or「EC2」から選択する。“ELB”
force_deleteオートスケーリンググループ内のEC2インスタンスがterminateしていない状態で、オートスケーリンググループの削除を許可するかどうかの設定。true
load_balancersELBの名前を設定する。CLBのみ使用可能。ALBの場合は、target_group_arnsを使用する。[“xxxxx”]
target_group_arnsELBのARNを設定する。ALB or NLBのみ使用可能。CLBの場合は、load_balancersを使用する。[“xxxxx”]
termination_policiesスケールインが発生した時に、どのインスタンスを最初に終了するか制御できる設定。OldestInstance, NewestInstance, OldestLaunchConfiguration, ClosestToNextInstanceHour, OldestLaunchTemplate, AllocationStrategy, Default.“OldestInstance”
suspended_processes中断するプロセス設定が可能。
Launch, Terminate, HealthCheck, ReplaceUnhealthy, AZRebalance, AlarmNotification, ScheduledActions, AddToLoadBalancer“HealthCheck”
placement_groupEC2インスタンスを起動するプレイスメントグループ。
metrics_granularityメトリクスの収集間隔。1分間隔しか指定することができないので注意。指定方法は、1Minute。“1Minute”
enabled_metricsオートスケーリンググループのメトリクスの有効化設定。trueなら有効。true
wait_for_capacity_timeoutオートスケーリンググループ内のEC2インスタンスのステータスがhealthyになるまで待機する時間。デフォルトは10分。「0」を設定すると無効になる。“10m”
min_elb_capacityELBのヘルスチェックでhealthyになるEC2インスタンスの数を指定する。指定された数のインスタンスが全てhealthyになるまでTerraformは待機する。この設定は、オートスケーリンググループを作成した時のみ使用可能。2
wait_for_elb_capacityELBのヘルスチェックでhealthyになるEC2インスタンスの数を指定する。指定された数のインスタンスが全てhealthyになるまでTerraformは待機する。この設定は、オートスケーリンググループ の作成&更新で使用可能。min_elb_capacityより優先される。
protect_from_scale_inスケールイン保護の有効化設定。false
service_linked_role_arnオートスケーリンググループにアタッチするIAMロールのARNを設定。“XXXXX”
max_instance_lifetimeEC2インスタンスの有効期限。0秒(無効) or 86400〜31536000秒の間で設定する。0
instance_refreshインスタンス更新に関する設定。ブロックで設定項目があるため、解説は後述。
warm_poolウォームプールの設定。ブロックで設定項目があるため、解説は後述。

上述の設定でいくつかブロックを指定する項目があったかと思います。以下では、それらを解説しています。

launch_template

項目解説
idlaunch templateのIDを設定。id or name のどちらかしか使えないので注意。
namelaunch templateの名前を設定。id or name のどちらかしか使えないので注意。
versionlaunch templateのバージョンを設定。バージョン番号 or $Latest or $Default 設定する。

mixed_instances_policy

オンデマンドインスタンス、スポットインスタンスを組み合わせて使用する場合のポリシーを設定することができます。instances_distributionlaunch_template を使用するのですが、それぞれさらに設定がネストされています。

instances_distribution

項目解説
on_demand_allocation_strategyオンデマンドインスタンスを使用する場合の戦略。prioritizedのみ指定可能。prioriteizedは、launch templateで指定されたインスタンスタイプの優先度に基づいて使用するEC2インスタンスタイプを決定する。
on_demand_base_capacity起動を維持するオンデマンドインスタンスの数。
on_demand_percentage_above_base_capacityon_demand_base_capacityを超えた分で、オンデマンドインスタンスとスポットインスタンスの内、オンデマンドインスタンスの割合。
spot_allocation_strategyスポットインスタンスの戦略。
lowest-price, capacity-optimized, capacity-optimized-prioritized
spot_instance_poolsspot_allocation_strategyがlowest-priceのときのみ使用可能。指定された数のスポットプールからスポットインスタンスを均等に起動させる。
spot_max_priceユーザーがスポットインスタンスに対して支払う意思のある単位時間あたりの最大価格。

<スポットインスタンスの戦略について>

推奨は、「capacity-optimized」。EC2が自動で最適なプールを選択して、そこからスポットインスタンスを起動する。そのため、中断の可能性を低くすることができる。

「lowest-price」は、起動時点での最低単価のスポットプールから順にインスタンスを起動する。選択するスポットプールは、spot_instance_poolsで指定した数だけ順に辿っていくため、ここはなるべく大きくすることでインスタンスが起動しないことを防ぐことが可能。

launch_template

項目解説
launch_template_specification起動テンプレートの設定。ブロックで設定項目があるため、解説は後述。
overrideオーバーライドの設定。ブロックで設定項目があるため、解説は後述。

launch_template_specification

項目解説
launch_template_idlaunch templateのIDを設定。launch_template_id or launch_template_name のどちらかしか使えないので注意。
launch_template_namelaunch templateの名前を設定。launch_template_id or launch_template_name のどちらかしか使えないので注意。
versionlaunch templateのバージョンを設定。バージョン番号 or $Latest or $Default 設定する。

override

項目解説
instance_typeオーバーライドしたいインスタンスタイプ。
launch_template_specificationオーバーライドしたい起動テンプレート。
weighted_capacityインスタンスの重みを設定する。

何のことか分からないと思います。なので、実例を使って少し解説します。

例えば、オートスケーリンググループにc5、c5a、c6gのインスタンスタイプを含めたいとします。c5はインテルプロセッサですが、c6はarmアーキテクチャのため、1つの起動テンプレートから起動させることができません。そんな時に活躍するのが、「override」。c6gのインスタンスタイプの時は、c5とは別の起動テンプレートを使用する。といったことが可能になります。

instance_type = "c6g.large"
launch_template_specification = "XXXXX" # c6g.large用の起動テンプレート

残るは、「weighted_capacity」。こいつは、重みを変えることでインスタンスの組み合わせを調整することができます。

DesiredCapacityが「4」で、c5.largeインスタンスタイプを使用する場合。オートスケーリンググループが起動させるインスタンス数は、重みナシと重みアリで以下のように異なってきます。

重みナシの場合4台
重みに「2」を設定する場合2台 ※重みが「2」のため、DesiredCapacity / 2 = 2台となります。

オートスケーリンググループのメトリクス

使用可能なメトリクスは以下の通り。

GroupMinSizeAuto Scaling グループの最小サイズ。
GroupMaxSizeAuto Scaling グループの最大サイズ。
GroupDesiredCapacityAuto Scaling グループが保持しようとするインスタンスの数。
GroupInServiceInstancesAuto Scaling グループの一部として実行するインスタンスの数。このメトリクスには保留中もしくは終了処理中のインスタンスは含まれません。
GroupPendingInstances保留中のインスタンスの数。保留中のインスタンスは、稼働状態ではありません。このメトリクスには稼働中もしくは終了処理中のインスタンスは含まれません。
GroupStandbyInstancesStandby 状態にあるインスタンスの数。この状態のインスタンスはまだ実行中ですが、実際には使用されていません。
GroupTerminatingInstances終了処理中のインスタンスの数。このメトリクスには稼働中もしくは保留中のインスタンスは含まれません。
GroupTotalInstancesAuto Scaling グループに含まれるインスタンスの合計数。このメトリクスは稼働中、保留中、および終了処理中のインスタンスの数を特定します。

instance_refresh

インスタンスの更新を利用することで、手動で置き換える必要がなくなります。

項目解説
strategyインスタンスの更新戦略。Rollingのみ指定可能。
preferencesインスタンスの更新のデフォルト設定をオーバーライドする。各種
〜以下はpreferencesの中で設定する項目〜
checkpoint_delayチェックポイント後に待機する時間を設定する。デフォルトは3600秒。
※チェックポイントとは、インスタンスの更新を一時的に停止させる時点のこと。
checkpoint_percentages置き換えるインスタンスの割合のしきい値。[10, 100]のように昇順で指定する(この指定の場合、「まず10%のインスタンスを更新して、2回目に残り全てを更新する」となる)。
instance_warmupウォームアップの時間を設定。インスタンスが起動してから通信を受信するまでの時間のこと。インスタンスの更新はウォームアップの時間を待ってから、次のインスタンスを更新する。
min_healthy_percentage正常に起動しているインスタンスを維持する最小正常倍率。100に設定すると、置き換えは1度に1台のインスタンスに限定される。0に設定すると、一度に全てのインスタンスを置き換える。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
triggers「launch_configuration、launch_template、mixed_instances_policy」このいずれかを指定する。指定されたプロパティの変更をトリガーにインスタンスの更新実行する。

warm_pool

ウォームプールは、初期化済みのEC2インスタンスのプールのこと。スケールアウトを高速化することが可能です。

項目解説
pool_stateウォームプールに入ったインスタンスの状態の設定。Stopped or Runningのどちらかが設定可能。
min_sizeウォームプールで維持する最小のインスタンス数。
max_group_prepared_capacityウォームプール内、またはAutoScalingグループの「終了」以外の状態で許可されるインスタンスの合計最大数。

以上で解説は終了です。お疲れ様でした。

プロフィール
この記事を書いた人
katsuya

SESからキャリアをスタートし、現在はフリーランスとして活動しています。フリーランスになってから6年で年収1,000万円を達成しました。「Study Infra」では、今までの経験やITインフラに関する情報を発信中です。

katsuyaをフォローする
AWSEC2
スポンサーリンク
シェアする
katsuyaをフォローする

コメント

タイトルとURLをコピーしました