ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

EC2 AutoScaling Group における ウォームプールについて

みなさん、こんにちは!

AWSグループの大澤 (@yukiblue63) です。

皆さんは、EC2 AutoScaling の ウォームプールを利用されたことがありますでしょうか?

今回は、EC2 AutoScaling の ウォームプールを利用される場合に気をつけたいポイントを含めてご紹介します。

Amazon EC2 Auto Scaling のウォームプール とは

  • EC2 におけるウォームプールは、インスタンスが大量のデータをディスクに書き込む必要があるなど、起動時間が非常に長いアプリケーションのレイテンシーを低減するために活用できる機能となります。

  • Auto Scaling グループに接続された初期化済みの EC2 インスタンスのプールです。これによって、AutoScalingグループにおいて、事前に準備済みのインスタンスを起動状態・停止状態・休止状態のいずれかの状態で待機させておくことができ、AMIからインスタンスを展開させる際に時間がかかってしまう場合に、起動までの時間を短縮させることが可能です。

今回の検証条件

下記のような条件を満たすようなウォームプールの設定を検討します。

  • 要件により、EC2インスタンスを再利用するために、ウォームプールにてインスタンスを停止状態で待機
  • スケールアウト時は、ウォームプールに待機させておいたインスタンスから起動
  • スケールイン時は、対象インスタンスを終了せずにウォームプールに戻して停止状態とする

ウォームプールにてインスタンスを停止状態で待機させる

EC2 AutoScaling グループの ウォームプールの設定で行います。

ウォームプールインスタンスの状態 にて、停止済み を選択します。

最小ウォームプールサイズ と ウォームプールサイズ について

  • 最小ウォームプールサイズ

    • 常にウォームプールに存在する必要があるインスタンスの最小数の設定です。 デフォルト値は0となりますが、1以上に設定すると、常にウォームプールに指定した台数のインスタンスが存在するように調整が行われます。
  • ウォームプールサイズ

    • ウォームプールサイズを定義します。
    • デフォルト仕様は、グループの最大容量から必要な容量を引いたものとなります。
    • カスタム仕様は、指定したインスタンス数からグループで必要な台数を引いたものとなります。

下記にウォームプールサイズ の設定例をご紹介します。

  • 前提条件
    • AutoScaling Group のグループサイズ設定
      • 希望するキャパシティ
        • 1
      • 最小台数
        • 1
      • 最大台数
        • 2

このとき、デフォルト仕様としたウォームプールサイズは、最大容量 (2) - 希望する容量 (1) = 1 (台) のように計算され、1台がウォームプールにインスタンスが存在します。

スケールイン時は、対象インスタンスを終了せずにウォームプールに戻して停止状態とする

下記のように、ウォームプールの設定において、「インスタンスの再利用」にチェックを入れます。

この設定を行うと、インスタンスがAutoScaling Group によってスケールインが行われた場合は、インスタンスが終了せずにウォームプールに戻ってくることになります。

なお、この設定はAWS-CLIでも有効化・無効化の切り替えを行うことが可能です。

* $ aws autoscaling put-warm-pool --auto-scaling-group-name <AutoScaling Group Name> --pool-state <ウォームプールインスタンスの状態> --instance-reuse-policy '{"ReuseOnScaleIn": <true or false>}'

実際にスケールアウト・スケールインをしてみる

それでは、実際に上記の設定を行ったAutoScaling Group を用意し、AutoScaling Group にて台数の増減 (スケールアウト・スケールイン) を行ってみます。

初期状態

下記の条件で、AutoScaling Group を作成した状態です。

  • AutoScaling Group のグループサイズ設定
    • 希望するキャパシティ
      • 1
    • 最小台数
      • 1
    • 最大台数
      • 2
  • ウォームプールの設定
    • ウォームプールインスタンスの状態
      • 停止済み
    • 最小ウォームプールサイズ
      • 0台

初期状態として、稼働中のインスタンス (ここでは、i-001cc164a539ee918)が1台 と ウォームプールに停止済みでインスタンス(ここでは、i-0e55a1c9627ea5f54) が1台存在しています。

スケールアウト

今回は、AutoScaling Group のグループサイズ設定 を下記のように変更します。

  • 希望するキャパシティ
    • 2
  • 最小台数
    • 1
  • 最大台数
    • 2

下記のように、停止状態となっていたインスタンスがウォームプールから起動していることがわかります。

スケールアウト

今回は、AutoScaling Group のグループサイズ設定 を下記のように変更します。

  • 希望するキャパシティ
    • 2
  • 最小台数
    • 1
  • 最大台数
    • 2

下記のように、稼働状態のインスタンスがウォームプールに戻り、停止状態となっていることがわかります。

よって、上記スケールアウト、スケールイン時にあらかじめウォームプールに存在するインスタンスを再利用した形で運用することも可能です。

なお、ドキュメントにも記載がある通り、半永久的にEC2インスタンスを再利用し続けるための機能ではないことに留意して頂く必要があります。

制限事項の一例をご紹介すると、

ウォームプール内のインスタンスで起動プロセス中に問題が発生し、 InService状態にならない場合、インスタンスは起動に失敗したと見なされ、終了します。これは、容量不足エラーやその他の要因など、根本的な原因に関係なく適用されます。

とあるように、起動中に問題が発生した場合は、インスタンスのTerminate(終了) が発生する可能性があると記載があるため、基本的には、EC2インスタンス内に永続的なデータは保持しないように設計することがポイントとなります。

まとめ

  • EC2 におけるウォームプールは、インスタンスが大量のデータをディスクに書き込む必要があるなど、起動時間が非常に長いアプリケーションのレイテンシーを低減するために活用できる機能

  • 「インスタンスの再利用」の機能を活用すると、EC2インスタンスを再利用し、スケールアウトとスケールイン時にウォームプールからインスタンスが起動と停止が行われ、循環的に利用が可能

  • 制約事項として、ウォームプールからインスタンス起動時に問題が発生した場合は、そのインスタンスがTerminate (終了) される可能性もあるため、基本としては、EC2インスタンス内に永続的なデータを保持しないように設計いただくことがポイントとなります。