Amazon EC2 Auto Scaling のウォームプール - Amazon EC2 Auto Scaling

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

ウォームプールを使用すると、インスタンスが大量のデータをディスクに書き込む必要があるなど、起動時間が非常に長いアプリケーションのレイテンシーを低減できます。ウォームプールの使用によって、アプリケーションのパフォーマンスを向上させるために、レイテンシーを管理するために Auto Scaling グループを過剰にプロビジョニングする必要がなくなりました。詳細については、ブログ記事 Scaling your applications faster with EC2 Auto Scaling Warm Pools (EC2 Auto Scaling ウォームプールを使用してアプリケーションをより高速にスケーリングする) をご覧ください。

重要

必要のないときにウォームプールを作成すると、不要なコストが発生する可能性があります。最初の起動時にアプリケーションに顕著なレイテンシーの問題が発生しない場合は、おそらくウォームプールを使用する必要はありません。

主要概念

開始する前に、以下の主要概念を理解してください。

ウォームプール

ウォームプールは、Auto Scaling グループに接続された初期化済みの EC2 インスタンスのプールです。アプリケーションがスケールアウトする必要があるときはいつでも、Auto Scaling グループはウォームプールに描画して、新しい希望する容量を満たすことができます。これにより、インスタンスがアプリケーショントラフィックを迅速化し、スケールアウトイベントへの応答を高速化できるようになります。インスタンスは、ウォームプールから離れたときに、グループの希望する容量にカウントされます。これは、ウォームスタートとして知られています。

インスタンスがウォームプールにある間、スケーリングポリシーは、InService 状態のインスタンスのメトリクス値がスケーリングポリシーのアラーム上限しきい値 (ターゲット追跡スケーリングポリシーのターゲット使用率と同じ値) を超える場合のみスケールアウトします。

ウォームプールのサイズ

デフォルトでは、ウォームプールのサイズは、Auto Scaling グループの最大容量と希望する容量の数値の差として計算されます。たとえば、Auto Scaling グループの希望する容量が 6 で、最大容量が 10 の場合、ウォームプールを最初にセットアップし、プールが初期化されるときに、ウォームプールのサイズは 4 になります。

ウォームプールの最大容量を個別に指定するには、グループの現在の容量よりも大きい最大準備容量の値を設定します。最大準備容量の値を設定すると、ウォームプールのサイズが、グループの最大準備容量と現在の希望容量の差として計算されます。例えば、Auto Scaling グループの希望する容量が 6、最大容量が 10、最大準備容量が 8 の場合、最初にウォームプールをセットアップして、プールが初期化されるときのウォームプールのサイズは 2 になります。

最大準備容量オプションは、大規模な Auto Scaling グループでの作業時にウォームプールを使用するコスト面でのメリットを管理するための使用以外は必要ないかもしれません。例えば、インスタンス 1,000 個、最大容量 1,500 個 (トラフィックの急増時に追加の容量を提供するため)、およびインスタンス 100 個のウォームプールがある Auto Scaling グループは、ウォームプール内に将来使用するインスタンスを 500 個予約しておくよりも、目標の達成に役立つ場合があります。

ウォームプールインスタンスの状態

ウォームプール内のインスタンスは、次の 3 つの状態のいずれかで保持できます: StoppedRunningHibernated。インスタンスをStopped状態で保持することは、コストを最小限に抑えるための効果的な方法です。停止したインスタンスでは、使用したボリュームとインスタンスにアタッチされた Elastic IP アドレスの分だけ料金が発生します。

または、インスタンスを Hibernated 状態に保持して、メモリコンテンツ (RAM) を削除せずにインスタンスを停止することができます。インスタンスが休止状態になると、RAM コンテンツを Amazon EBS ルートボリュームに保存するようオペレーティングシステムに通知されます。インスタンスを再起動すると、ルートボリュームは以前の状態に復元され、RAM コンテンツがリロードされます。インスタンスが休止状態になっている間は、RAM コンテンツのストレージ、インスタンスにアタッチされた Elastic IP アドレスなどの EBS ボリュームに対してのみ料金が発生します。

ウォームプール内のインスタンスを Running 状態にしておくことも可能ですが、不必要な料金の発生避けるためにも、そうしておかないことを強くお勧めします。インスタンスを停止または休止状態にしておくと、インスタンス自体のコストが削減されます。インスタンスの料金は、インスタンスが実行されている場合にのみ発生します。

ライフサイクルフック

ライフサイクルフックは、インスタンスに対してカスタムアクションを実行できるように、インスタンスを待機状態にします。カスタムアクションは、インスタンスの起動時または終了前に実行されます。

ウォームプール設定では、インスタンスの初期化が完了するまで、ライフサイクルフックによってスケールアウトイベント中のインスタンスの停止、休止、サービス開始を遅延することもできます。ライフサイクルフックなしで Auto Scaling グループにウォームプールを追加すると、初期化の完了までに長い時間がかかるインスタンスは停止または休止状態になり、準備が整う前にスケールアウトイベントが開始する可能性があります。

インスタンスの再利用ポリシー

デフォルトでは、Amazon EC2 Auto Scaling は、Auto Scaling グループがスケールインするとインスタンスを終了します。次に、新しいインスタンスをウォームプールで起動し、終了したインスタンスを置換します。

置換する代わりに、インスタンスをウォームプールに戻す場合は、インスタンスの再利用ポリシーを指定します。これにより、アプリケーショントラフィックを処理するように設定されたインスタンスを再利用できます。ウォームプールが過剰プロビジョニングされないように、Amazon EC2 Auto Scaling はウォームプール内のインスタンスを終了し、その設定に基づいて、必要以上に大きくなったときにそのサイズを減らすことができます。ウォームプール内のインスタンスを終了する際に、Amazon EC2 Auto Scaling はデフォルトの終了ポリシーを使用して、最初に終了するインスタンスを選択します。

重要

スケールイン時にインスタンスを休止し、Auto Scaling グループに既存のインスタンスがある場合は、インスタンスの休止要件を満たしている必要があります。要件を満たしていない場合、インスタンスがウォームプールに戻ると、休止状態ではなく停止状態にフォールバックします。

注記

現在、インスタンスの再利用ポリシーを指定できるのは、AWS CLI または SDK のみです。この機能はコンソールからは利用できません。

前提条件

ライフサイクルフックを使用してインスタンスを使用できるように準備する方法を決定します。インスタンスでカスタムアクションを実行するには、2 つの方法があります。

  • 起動時にインスタンスでコマンドを実行する単純なシナリオでは、Auto Scaling グループの起動テンプレートまたは起動設定の作成時にユーザーデータスクリプトを含めることができます。ユーザーデータスクリプトは、インスタンスの起動時に cloud-init により実行される通常のシェルスクリプトまたは cloud-init ディレクティブです。このスクリプトは、実行されるインスタンスの ID を使用して、インスタンスが次の状態に移行するタイミングを制御することもできます。まだそうしていない場合は、インスタンスメタデータからインスタンスのインスタンス ID を取得するためのスクリプトを更新します。詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「インスタンスメタデータを取得する」を参照してください。

    ヒント

    インスタンスの再起動時にユーザーデータスクリプトを実行するには、ユーザーデータを MIME マルチパート形式で指定し、ユーザーデータの #cloud-config セクションで以下を指定します。

    #cloud-config cloud_final_modules: - [scripts-user, always]
  • ウォームプールに出入りするインスタンスとして何かを実行する、AWS Lambda のようなサービスを必要とするアドバンストシナリオでは、Auto Scaling グループのライフサイクルフックを作成し、ターゲットサービスを設定して、ライフサイクル通知に基づいてカスタムアクションを実行することができます。詳細については、「サポートされている通知ターゲット」を参照してください。

詳細については、GitHub レポジトリのライフサイクルフックの例を参照してください。

インスタンス休止のための準備

Hibernated のプール状態を使用して Auto Scaling インスタンスを準備するには、Linux インスタンス用 Amazon EC2 ユーザーガイド休止の前提条件のトピックの説明に従って、インスタンスの休止状態をサポートするよう正しく設定された新しい起動テンプレートまたは起動設定を作成します。次に、新しい起動テンプレートまたは起動設定を Auto Scaling グループに関連付けてインスタンスの更新を開始し、以前の起動テンプレートまたは起動設定に関連付けられているインスタンスを置換します。詳細については、「インスタンスの更新に基づいて Auto Scaling インスタンスを置き換える」を参照してください。

ウォームプールを作成する

次の手順に従って、コンソールを使用してウォームプールを作成します。

作業開始前に、Auto Scaling グループのライフサイクルフックが作成されていることを確認します。

ウォームプールを作成するには (コンソール)

  1. Amazon EC2 Auto Scaling コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

  2. 既存のグループの横にあるチェックボックスをオンにします。

    Auto Scaling グループページの下部に分割ペインが開きます。

  3. [インスタンス管理] タブを選択します。

  4. [ウォームプール] で、ウォームプールの作成を選択します。

  5. ウォームプールを設定するには、次の手順を実行します。

    1. ウォームプールインスタンスの状態で、インスタンスがウォームプールに入ったときに、どの状態に移行するかを選択します。デフォルト: Stopped

    2. 最小ウォームプールサイズに、ウォームプールに維持するインスタンスの最小数を入力します。

    3. [Max prepared capacity] (準備済みの最大容量) には、一定数のインスタンスを定義することで準備済みの最大容量を指定するか、デフォルトのオプションを維持して、準備済みの最大容量を未定義のままにすることができます。

      デフォルトの [Equal to the Auto Scaling group's maximum capacity] (Auto Scaling グループの最大容量と同等) を維持すると、ウォームプールのサイズは、Auto Scaling グループの最大容量と希望容量の差に一致するように変更されます。グループの最大容量を調整することによってウォームプールのサイズを簡単に管理できるようにするため、デフォルトオプションを使用することをお勧めします。

      [Define a set number of instances] (インスタンスのセット数の定義) オプションを選択する場合は、ウォームプールと Auto Scaling グループに同時に含めることができるインスタンスの最大数を表す値を入力します。

  6. [Create] を選択します。

ウォームプールを更新する

ウォームプールの起動テンプレートまたは起動設定を変更するには、新しい起動テンプレートまたは起動設定に Auto Scaling グループを関連付けます。新しいインスタンスは、起動テンプレートまたは起動設定で指定された新しい AMI およびその他の更新を使用して起動されますが、既存のインスタンスは影響を受けません。

新しい起動テンプレートまたは起動設定を使用する代替ウォームプールインスタンスを強制的に起動すると、ウォームプール内の既存のインスタンスを終了させることができます。Amazon EC2 Auto Scaling は、直ちに新しいインスタンスの起動を開始し、終了したインスタンスを置き換えます。または、インスタンスの更新を開始して、グループのローリング更新を実行することもできます。インスタンスの更新は、最初にInServiceインスタンスを置き換えます。その後、ウォームプール内のインスタンスが置き換えられます。詳細については、「インスタンスの更新に基づいて Auto Scaling インスタンスを置き換える」を参照してください。

ウォームプールを削除する

ウォームプールが不要になった場合は、次の手順にしたがって削除します。

ウォームプールを削除するには (コンソール)

  1. Amazon EC2 Auto Scaling コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

  2. 既存のグループの横にあるチェックボックスをオンにします。

    Auto Scaling グループページの下部に分割ペインが開きます。

  3. [インスタンス管理] タブを選択します。

  4. [Warm pool] (ウォームプール) で、[Actions] (アクション)、[Delete] (削除) の順に選択します。

  5. 確認を求めるメッセージが表示されたら、[削除] を選択します。

制約事項

  • 混合インスタンスポリシーを持つ Auto Scaling グループまたはスポットインスタンスを起動する Auto Scaling グループにはウォームプールを追加できません。

  • Amazon EC2 Auto Scaling は、ルートデバイスとして Amazon EBS ボリュームを持つ場合にのみ、インスタンスを Stopped または Hibernated 状態にすることができます。ルートデバイスにインスタンスストアを使用するインスタンスは停止または休止できません。

  • Amazon EC2 Auto Scaling は、Linux インスタンス用 Amazon EC2 ユーザーガイド休止の前提条件のトピックに一覧表示されているすべての要件を満たしている場合にのみ、インスタンスを Hibernated 状態にすることができます。

  • スケールアウトイベントがあるときにウォームプールが枯渇した場合、インスタンスは Auto Scaling グループ内に直接起動されます (コールドスタート)。また、アベイラビリティーゾーンが容量不足の場合にコールドスタートが発生する可能性があります。

  • Amazon Elastic Kubernetes Service (Amazon EKS) マネージドノードグループでウォームプールを使用しようとする場合、まだ初期化中のインスタンスが Amazon EKS クラスターに登録される可能性があります。その結果、このクラスターは、インスタンスが停止または休止の準備を行っているときにインスタンスでジョブをスケジュールする場合があります。Amazon ECS クラスターでウォームプールを使用するには、起動テンプレートまたは起動設定が正しく設定される必要があります。詳細については、「Amazon Elastic Container Service デベロッパーガイド」の「Auto Scaling グループ用のウォームプールの使用」を参照してください。

  • ウォームプール用の休止状態サポートは、Amazon EC2 Auto Scaling を利用できる、ほぼすべての商用 AWS リージョン で使用可能です。中国 (北京)、中国 (寧夏)、AWS GovCloud (米国東部および米国西部) リージョンは対象外です。