Auto Scaling のウォームアップとは ── 起動が遅いアプリでインスタンスが増えすぎるのを防ぐ

目次

概要

EC2 Auto Scaling は、負荷が上がるとインスタンスを足してくれます。ところが、アプリケーションの初期化に時間がかかると、足したインスタンスが「起動はしたが、まだリクエストを処理できない」時間が生まれます。この間のメトリクスをそのまま判断に使うと、必要以上にインスタンスを増やしたり、増やしたはずなのに応答が追いつかなかったりします。

この空白の時間を Auto Scaling に教えるのが インスタンスのウォームアップ です。グループに「デフォルトのインスタンスのウォームアップ」を設定すると、ウォームアップ中のインスタンスはメトリクスの集計から外れ、一方で追加済みの容量としては数えられるため、同じ負荷に対して何度もスケールアウトすることがなくなります。

また、毎日決まった時刻に混むことが分かっているなら、負荷が上がってから増やすのではなく、スケジュールされたスケーリング や 予測スケーリング で先回りして増やす選択肢もあります。

この記事では、Auto Scaling のスケーリング方法の違いと、ウォームアップの仕組みを整理します。実践では、応答できるまで 1 分以上かかる Web サーバーにウォームアップとステップスケーリングを設定し、負荷をかけても、ウォームアップの間は台数が増えないことを確かめたうえで、正午前に台数を増やすスケジュールを設定します。

負荷が上がってから応答できるまで ── ウォームアップ中は「容量に数え、メトリクスに数えない」
負荷が上がってから応答できるまで ── ウォームアップ中は「容量に数え、メトリクスに数えない」
クラウドおさる

当番の猿を増やしても、着替えて持ち場に着くまでは戦力にならないでござる。その「着替え中」をどう数えるかが、今日のウォームアップの話でござるよ。

この記事のメリット

  • ターゲット追跡・ステップ・シンプル・スケジュール・予測の各スケーリングの違いと使いどころが分かる
  • デフォルトのインスタンスのウォームアップの役割と、ウォームアップ中のインスタンスの扱いを説明できるようになる
  • 起動に時間がかかるアプリケーションで、過剰なスケールアウトを防ぐ設定ができるようになる
  • 決まった時刻の混雑に、スケジュールや予測で先回りする方法が分かる
  • 「起動の遅さ」の対策になるものと、ならないものを区別できるようになる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

起動から応答までの「空白の時間」

Auto Scaling が起動したインスタンスは、InService になった時点でグループの一員になります。しかし、アプリケーションの初期化(パッケージの導入、設定の読み込み、キャッシュの準備など)が終わるまでは、リクエストを処理できません。

この間のインスタンスのメトリクスは、実際の負荷を表していません。初期化処理で CPU が一時的に跳ね上がることもあれば、まだリクエストを受けていないので CPU がほぼ 0% のこともあります。どちらにしても、グループ全体の平均に混ぜると判断がぶれます。

状態起こりがちなこと
初期化中のインスタンスの高い CPU を平均に混ぜるまだ負荷が高いと判断して、さらにスケールアウトする(過剰なスケールアウト)
初期化中のインスタンスの低い CPU を平均に混ぜる負荷が下がったと判断して、スケールインしてしまう
足したインスタンスを容量として数えない同じ負荷に対して何度もスケールアウトする

スケーリングの方法

EC2 Auto Scaling には、負荷に応じて増減する「動的スケーリング」と、時刻や予測に基づいて先回りする方法があります。

方法いつ動くか向いているケース
ターゲット追跡スケーリングメトリクスを目標値(例: 平均 CPU 50%)に保つように自動で増減する。CloudWatch アラームは Auto Scaling が作成・管理するほとんどのケース。AWS が最初に勧めている方法
ステップスケーリング自分で作った CloudWatch アラームの超過幅に応じて、段階的に増減する超過幅ごとの増減数を細かく決めたいとき
シンプルスケーリングアラームで 1 段だけ増減し、各スケーリングアクティビティの間にクールダウン期間を置く1 段の増減で足りるとき。段階を分けたいならステップスケーリング
スケジュールされたスケーリング指定した日時に、希望・最小・最大の台数を設定する混む時刻が決まっているとき
予測スケーリング過去の負荷から日・週の周期を学習し、予測に合わせて先に増やす周期的な負荷、初期化に時間がかかるアプリ
動的スケーリングは「混んでから」、スケジュール・予測は「混む前に」増やす
動的スケーリングは「混んでから」、スケジュール・予測は「混む前に」増やす

インスタンスのウォームアップ

デフォルトのインスタンスのウォームアップ は、インスタンスが InService になってから、そのメトリクスをグループの集計に使い始めるまでの待ち時間です。Auto Scaling グループ単位で設定します。

項目内容
設定する場所Auto Scaling グループ(作成時の「追加設定」、または既存グループの「詳細」タブ →「高度な設定」)
値0〜3600 秒。分からなければ 300 秒から始めて調整する
既定有効になっていない。ターゲット追跡・ステップスケーリングを使うなら、有効にすることが強く推奨されている
ポリシーとの関係ターゲット追跡・ステップスケーリングのポリシーでウォームアップを指定しなければ、グループの値が使われる

ウォームアップ中のインスタンスは、次のように扱われます。

  • メトリクスの集計には入らない: ウォームアップが終わるまで、グループの集約メトリクスに数えない
  • 容量には入る: 次にスケールアウトするとき、ウォームアップ中のインスタンスはグループの容量の一部として数える。そのため、同じステップの範囲にとどまるアラームの超過が続いても、スケーリングアクティビティは 1 回で済む
  • スケールインは止まる: 新しいインスタンスのウォームアップが終わるまで、動的スケーリングによるスケールインはブロックされる
  • 追加のスケールアウトは条件付き: ウォームアップ中は、ウォームアップしていないインスタンスのメトリクスがしきい値を超えている場合にだけスケールアウトする
ウォームアップ中のインスタンスは、容量には数えるがメトリクスの平均には入れない
ウォームアップ中のインスタンスは、容量には数えるがメトリクスの平均には入れない
クラウドおさる

着替え中の当番は、見張り台の人数には数えるけれど、疲れ具合の平均には入れないのでござる。だから「まだ足りぬ」と何度も呼び足すことがなくなるのでござるな。

決まった時刻に混むなら先回りする

ウォームアップは「増やしたあとの判断」を正しくする仕組みです。初期化に時間がかかるアプリケーションでは、混み始めてから増やすと、増えたインスタンスが応答できるまでの間はどうしても遅くなります。混む時刻が分かっているなら、先に増やしておくほうが確実です。

項目スケジュールされたスケーリング予測スケーリング
何を決めるか日時と、そのときの希望・最小・最大の台数予測に使うメトリクスと目標値
繰り返しcron 式で指定。タイムゾーンの既定は UTC で、Asia/Tokyo などを指定できる過去最長 14 日のデータから日・週のパターンを見つける
準備なし予測を始めるには 24 時間以上のデータが必要(2 週間あると効果的)
動き方指定時刻に台数を設定する48 時間先までの時間ごとの予測を 6 時間ごとに更新し、その時間の始めに台数を増やす。「起動前のインスタンス」で開始を早められる
注意1 グループに 125 個まで。同じ開始時刻のアクションは作れない最初は「予測のみ」モードで、予測を確かめてから「予測とスケーリング」に切り替える

予測スケーリングでも、予測された需要の前に新しいインスタンスを用意できるよう、デフォルトのインスタンスのウォームアップを有効にすることが強く推奨されています。

クラウドおさる

スケジュールの時刻は、タイムゾーンを選ばないと UTC で動くのでござる。「正午に増やす」つもりが日本時間の 21 時に増えた、では猿山の昼バナナ配りに間に合わないでござるぞ。

起動の遅さへの対策にならないもの

負荷対策の仕組みは多くありますが、「起動から応答までに時間がかかる」問題を直接解決するものは限られます。

仕組み何をするか起動の遅さに効くか
ALB のターゲットグループのスロースタート正常になったばかりのターゲットに送るリクエストを、指定した期間で徐々に増やす増えたあとの負荷のかけ方を穏やかにするだけで、いつ増やすかの判断は変わらない
ElastiCache・CloudFront読み込みやコンテンツの配信を肩代わりして、サーバーの負荷を下げる負荷そのものを減らす対策で、スケーリングの判断のぶれは解決しない
ウォームアップ初期化中のインスタンスを、メトリクスに数えず容量には数える効く。過剰なスケールアウトを防ぐ
スケジュール・予測スケーリング混む前にインスタンスを増やしておく効く。混雑の時点で初期化を終えておける
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド6 ステップ画面 7 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

応答できるまで 1 分以上かかる Web サーバーの Auto Scaling グループに、デフォルトのインスタンスのウォームアップとステップスケーリングを設定します。負荷をかけて、追加したインスタンスがウォームアップしている間は次のインスタンスが起動されないこと、台数が足りるとアラームが収まることを確かめます。最後に、正午前に台数を増やすスケジュールされたアクションを作ります。

前提条件

  • リージョン: ap-northeast-1(東京)
  • EC2・Auto Scaling・CloudWatch・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること

以下のリソースが作成済みであることを前提とします。Auto Scaling グループには、まだスケーリングポリシーもウォームアップも設定されていません。

まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。

リソース種別リソース名内容作り方の参考
VPC・パブリックサブネットwarmup-lab-vpc / warmup-lab-public-1a / warmup-lab-public-1c2 つの AZ のパブリックサブネット。インターネットゲートウェイへのルートありEC2 Auto Scaling で落ちても自動で戻る Web サーバーを作る
Application Load Balancerwarmup-lab-albインターネット向け。ターゲットグループ warmup-lab-tg に転送同上
起動テンプレートwarmup-lab-web-templateAmazon Linux 2023・t3.micro。起動後 60 秒待ってから Web サーバー(httpd)を起動する。負荷をかける stress-ng を導入済み。詳細モニタリングが有効。Session Manager で接続できるインスタンスプロファイル付き同上 ※ユーザーデータと詳細モニタリング、インスタンスプロファイルを足す
Auto Scaling グループwarmup-lab-asg2 つのパブリックサブネット。最小 1・希望 1・最大 4。ヘルスチェックは ELB。起動したインスタンスには Name タグ warmup-lab-web が付く同上 ※スケーリングポリシーは作らない

ALB と EC2 は起動している間ずっと課金されます。負荷をかけるとインスタンスが増えるため、検証が終わったら必ず削除してください。

手順 1: デフォルトのインスタンスのウォームアップを設定する

AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに EC2 と入力し、「EC2」を選択します。左側ナビゲーションの「Auto Scaling」→「Auto Scaling グループ」を選択し、warmup-lab-asg を開きます。

「詳細」タブの「高度な設定」で「編集」をクリックし、以下を設定します。

  • 「デフォルトのインスタンスのウォームアップを有効にする」にチェックを入れ、表示された入力欄に 180 秒

その他の項目はデフォルトのままにして、「更新」をクリックします。ユーザーデータで 60 秒待ってから httpd を起動するので、OS の起動を含めると Web サーバーの応答までに約 2 分かかります。そのため、余裕を見て 180 秒にしています。

高度な設定の編集画面(デフォルトのインスタンスのウォームアップを 180 秒に設定した状態)
高度な設定の編集画面(デフォルトのインスタンスのウォームアップを 180 秒に設定した状態)

手順 2: CPU 使用率のアラームを作る

上部の検索バーに CloudWatch と入力し、「CloudWatch」を選択します。左側ナビゲーションの「アラーム」→「すべてのアラーム」を選択し、「アラームの作成」をクリックします。

「メトリクスの選択」をクリックし、「EC2」→「Auto Scaling グループ別」を選択します。検索欄に warmup-lab-asg と入力し、候補の AutoScalingGroupName = warmup-lab-asg を選んで絞り込みます(名前が似た別のグループも一覧に出るためです)。warmup-lab-asg の CPUUtilization にチェックを入れ、「メトリクスの選択」をクリックします。続けて以下を設定します。

  • 統計: 平均値(デフォルト)
  • 期間: 1 分(デフォルトは 5 分)
  • しきい値の種類: 静的
  • CPUUtilization が…: 以上、60
アラームの条件設定画面(Auto Scaling グループの平均 CPU 使用率が 60% 以上)
アラームの条件設定画面(Auto Scaling グループの平均 CPU 使用率が 60% 以上)

「次へ」をクリックし、「通知」は「削除」で外します。「次へ」をクリックすると「アクションが設定されていません」と確認されるので、「アクションなしで続行」をクリックします(スケーリングのアクションは、手順 3 のポリシーからこのアラームに結び付けます)。アラーム名に warmup-lab-cpu-high と入力します。「次へ」をクリックし、内容を確認して「アラームの作成」をクリックします。

手順 3: ステップスケーリングポリシーを作る

EC2 コンソールの「Auto Scaling グループ」に戻り、warmup-lab-asg の「自動スケーリング」タブを開きます。「動的スケーリングポリシー」で「動的スケーリングポリシーを作成する」をクリックし、以下を設定します。

  • ポリシータイプ: ステップスケーリング(デフォルトは ターゲット追跡スケーリング)
  • スケーリングポリシー名: warmup-lab-step-out
  • CloudWatch アラーム: warmup-lab-cpu-high
  • アクションを実行: 追加、1、容量ユニット(60 <= CPUUtilization < +無限大 の 1 段だけ。60 はアラームのしきい値から自動で入ります)
  • インスタンスのウォームアップ: 空欄のまま(グループのデフォルトのインスタンスのウォームアップ 180 が薄く表示されます)
ステップスケーリングポリシーの作成画面(アラームと 1 台追加のステップを設定した状態)
ステップスケーリングポリシーの作成画面(アラームと 1 台追加のステップを設定した状態)

「作成」をクリックします。

手順 4: 負荷をかけて、ウォームアップの間は台数が増えないことを確かめる

左側ナビゲーションの「インスタンス」→「インスタンス」を選択し、warmup-lab-asg が起動したインスタンス(名前 warmup-lab-web)を選択して「接続」をクリックします。「SSM セッションマネージャー」が選ばれていることを確認して「接続」をクリックし、次のコマンドで CPU に 15 分間の負荷をかけます。Session Manager の作業ディレクトリには書き込めないため、--temp-path /tmp を付けます。

stress-ng --cpu 0 --timeout 15m --temp-path /tmp
Session Manager で stress-ng を実行している画面
Session Manager で stress-ng を実行している画面

数分すると、アラーム warmup-lab-cpu-high が アラーム状態 になり、Auto Scaling グループに 1 台追加されます。

最初のインスタンスは負荷をかけ続けているので、アラームは アラーム状態 のままです。それでも、追加したインスタンスはウォームアップ中も容量として数えられるため、その間は次のインスタンスは起動されません。

ウォームアップの 180 秒が過ぎると、追加したインスタンスのメトリクスが集計に入ります。そのときアラームがまだ アラーム状態 なら、もう 1 台追加されます。今回は、集計に入った直後のデータポイントがまだ 60% 以上だったため、1 台目の追加から 4 分後に 2 台目が追加されました。その後、平均の CPU 使用率は 50% ほどに下がり、アラームは OK に戻りました。

warmup-lab-asg の「アクティビティ」タブで、インスタンスの起動の間隔が、ウォームアップの 180 秒より長く空いていることを確認します。

アクティビティ履歴(負荷をかけたあとのインスタンスの起動が、ウォームアップより長い間隔で記録された状態)
アクティビティ履歴(負荷をかけたあとのインスタンスの起動が、ウォームアップより長い間隔で記録された状態)

CloudWatch の「アラーム」で warmup-lab-cpu-high を開き、グラフで確認します。

warmup-lab-cpu-high のグラフ(しきい値を超えたあと、ウォームアップ後に OK に戻った状態)
warmup-lab-cpu-high のグラフ(しきい値を超えたあと、ウォームアップ後に OK に戻った状態)
クラウドおさる

アラームが鳴りっぱなしでも、当番の着替えが終わるまでは次の当番を呼ばなかったでござる。着替え中の当番も人数に数えているから、慌てて呼び足さないのでござるな。

手順 5: 正午前に台数を増やすスケジュールを作る

毎日正午に混むことが分かっている前提で、11:50 に台数を増やしておくスケジュールを作ります。

warmup-lab-asg の「自動スケーリング」タブの「予定されたアクション」で「予定されたアクションを作成する」をクリックし、以下を設定します。

  • 名前: warmup-lab-before-noon
  • 希望する容量: 2、最小: 2、最大: 4
  • 反復: Cron(デフォルトは 一度)を選び、表示された入力欄に 50 11 * * *
  • タイムゾーン: Asia/Tokyo(デフォルトは Etc/UTC。検索欄に入力して選びます)
  • 開始日: 明日の日付(YYYY/MM/DD の形式)。開始時刻はデフォルトの 00:00 のまま
スケジュールされたアクションの作成画面(Cron とタイムゾーン Asia/Tokyo を設定した状態)
スケジュールされたアクションの作成画面(Cron とタイムゾーン Asia/Tokyo を設定した状態)

「作成」をクリックし、「予定されたアクション」の一覧に warmup-lab-before-noon が表示されることを確認します。実際の運用では、混雑が終わる時刻に最小の台数を戻すアクションもあわせて作ります。

クラウドおさる

「起動に時間がかかる」と言われたらウォームアップ、「毎日決まった時刻に混む」と言われたらスケジュールか予測でござる。スロースタートやキャッシュは負荷の受け方を変えるだけで、いつ増やすかの判断は変えない、と見分けられるかが肝でござるな。

まとめ

要件選ぶもの
メトリクスを目標値に保ちたい(ほとんどのケース)ターゲット追跡スケーリング
超過幅ごとに増やす台数を決めたいステップスケーリング
起動から応答まで時間がかかり、過剰にスケールアウトするデフォルトのインスタンスのウォームアップを有効にする
混む時刻が決まっているスケジュールされたスケーリング(タイムゾーンを指定)
日・週の周期で負荷が変わる予測スケーリング(予測のみモードで確かめてから適用)
  • ウォームアップ中のインスタンスは、メトリクスの集計には入らず、容量には入る。そのため同じ範囲のアラーム超過が続いてもスケールアウトは 1 回で済み、スケールインもウォームアップが終わるまで止まる
  • デフォルトのインスタンスのウォームアップは既定で無効。0〜3600 秒で、分からなければ 300 秒から調整する。ポリシー側で指定しなければグループの値が使われる
  • スケジュールされたアクションのタイムゾーンの既定は UTC。1 グループに 125 個まで
  • 予測スケーリングは 24 時間以上のデータで予測を始め、48 時間先までの予測を 6 時間ごとに更新する

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次