キャパシティーの再調整を使用して Amazon EC2 スポットの中断に対処する - Amazon EC2 Auto Scaling

キャパシティーの再調整を使用して Amazon EC2 スポットの中断に対処する

スポットインスタンスの可用性に影響する変更をモニタリングし、自動的に応答するように Amazon EC2 Auto Scaling を設定できます。容量の再調整は、実行中のインスタンスが Amazon EC2 により中断される前に、新しいスポットインスタンスでフリートを事前に拡張することにより、ワークロードの可用性を維持するのに役立ちます。

使用方法

キャパシティーの再調整の目標は、ワークロードの処理を中断されることなく継続することです。スポットインスタンスの中断リスクが高い場合、Amazon EC2 スポットサービスは、Amazon EC2 Auto Scaling に EC2 インスタンスの再調整レコメンデーションを通知します。

Auto Scaling グループに対してキャパシティーの再調整を有効にすると、Amazon EC2 Auto Scaling は、再調整レコメンデーションを受け取ったグループ内のスポットインスタンスを積極的に置き換えようとします。これは、ワークロードを中断リスクが低い新しいスポットインスタンスに再調整する機会を提供します。ワークロードは、既存のインスタンスが中断される前に Amazon EC2 Auto Scaling が新しいスポットインスタンスを起動している間も、作業の処理を続行できます。

オプションで、インスタンスが終了される前にそれらでカスタムアクションを実行するライフサイクルフックを使用することも可能です。

EC2 インスタンスの再調整レコメンデーションの詳細については、[Linux インスタンス用 Amazon EC2 ユーザーガイド] の [EC2 インスタンス再調整レコメンデーション] を参照してください。

キャパシティーの再調整の特徴の詳細とチュートリアルについては、AWSコンピューティング ブログの [EC2 Auto Scaling の新しいキャパシティーの再調整の特徴を使用して、スポットインスタンスのライフサイクルをプロアクティブに管理] のブログ記事をご覧ください。

注記

キャパシティーの再調整が無効化されていると、Amazon EC2 Auto Scaling は、Amazon EC2 スポットサービスがインスタンスを中断し、それらのヘルスチェックが失敗するまでスポットインスタンスを置き換えません。Amazon EC2 は常に、インスタンスを中断する前に EC2 インスタンスの再調整レコメンデーションと、スポットインスタンスの中断 2 分前の通知の両方を提供します。

考慮事項

容量の再調整用に Auto Scaling グループを設定する場合は、次の点を考慮してください。

  • 複数のインスタンスタイプを使用するようにAuto Scaling グループを設定することをお勧めします。これにより、複数のインスタンスタイプと購入オプションを使用する Auto Scaling グループで説明するように、各アベイラビリティーゾーン内のさまざまなスポットインスタンス プールでインスタンスを起動する柔軟性が得られます。

  • lowest-price 割り当て戦略を使用している場合、代替スポットインスタンスが中断するリスクが高くなることがあります。これは、代替スポットインスタンスが起動後すぐに中断される可能性が高い場合も、必ず、その時点で利用可能な容量を持つ最低料金のプールでインスタンスを起動することが原因です。中断のリスクが高くなるのを避けるため、lowest-price アロケーションストラテジー、代わりに推奨する capacity-optimized または capacity-optimized-prioritized 配分戦略。これらの戦略の目標は、最適なスポットキャパシティープールで代替のスポットインスタンスを起動して、それらが近い将来中断される可能性を減らすことです。

  • 可能な限り、リージョン内のすべてのアベイラビリティーゾーンに Auto Scaling グループを作成する必要があります。そうすることで、Amazon EC2 Auto Scaling は各アベイラビリティーゾーンで利用可能な容量を検討できるようになります。1 つのアベイラビリティーゾーンで起動が失敗した場合、Amazon EC2 Auto Scaling は成功するまで、指定されたアベイラビリティーゾーン全体でスポットインスタンスを起動しようとします。

  • キャパシティーの再調整では、Amazon EC2 Auto Scaling が以下のように動作します。

    新しいインスタンスの起動時、Amazon EC2 Auto Scaling は、新しいインスタンスがヘルスチェックに合格するまで待機してから、以前のインスタンスの終了に進みます。複数のインスタンスを置き換える場合、以前の各インスタンスの終了は、新しいインスタンスが起動され、ヘルスチェックに合格してから開始されます。Amazon EC2 Auto Scaling は以前のインスタンスを終了する前に新しいインスタンスの起動を試みるため、指定された最大容量に到達している、またはそれに近い状態は、再調整アクティビティを妨げたり、それらを完全に停止させる可能性があります。この問題を回避するため、Amazon EC2 Auto Scaling、再調整アクティビティの間、グループに指定されている最大キャパシティーを一時的に超えることができます。

    • 新しいインスタンスの起動に失敗するか、起動してもヘルスチェックに失敗した場合、Amazon EC2 Auto Scaling はそれらの再起動を試みます。新しいインスタンスの起動試行中、以前のインスタンスは最終的に中断され、強制的に終了されます。

    • スケーリングアクティビティが進行中で、Auto Scaling グループが新しい希望容量を下回っている場合、Amazon EC2 Auto Scaling はまずスケールアウトを行ってから、以前のインスタンスを終了します。

  • キャパシティーの再調整を有効化するときに Auto Scaling グループの終了ライフサイクルフックを設定して、Amazon EC2 Auto Scaling が再調整通知を受け取るインスタンスを終了する前に、それらのインスタンス内でアプリケーションの正常なシャットダウンを試みることができます。ライフサイクルフックを設定しない場合、Amazon EC2 Auto Scaling は、新しいインスタンスがヘルスチェックに合格すると同時に以前のインスタンスの終了を開始します。

  • アプリケーションでは、スポットインスタンスが早期に中断される可能性を処理する必要があります。例えば、インスタンスが終了を開始すると、Amazon EC2 Auto Scaling はインスタンスが終了するのを待ちます。Auto Scaling グループが Elastic Load Balancing ロードバランサーの背後にある場合、Amazon EC2 Auto Scaling は、インスタンスがロードバランサーから登録解除されるまで待機してから、終了ライフサイクルフックを呼び出します(設定されている場合)。インスタンスの登録解除とライフサイクルアクションの完了にかかる時間が長すぎる場合は、Amazon EC2 Auto Scaling がインスタンスの終了を待つ間に、インスタンスが中断されることがあります。

  • 2 分間のスポットインスタンス中断通知の前に、Amazon EC2 が再調整に関するレコメンデーションシグナルを送信することは、常に可能であるとは限りません。場合によっては、再調整に関するレコメンデーションシグナルが、2 分間の中断通知とともに到着する可能性があります。

  • インスタンスが最後の 2 分間の中断通知を受け取った場合、Amazon EC2 Auto Scaling は終了ライフサイクルフックを呼び出し、すぐに置き換えを起動しようとします。

キャパシティーの再調整は、スポットインスタンスの中断率を増加させるものではありません

キャパシティーの再調整を有効にしても、スポットインスタンスの中断率 (Amazon EC2 がキャパシティーを取り戻す必要があるときに再利用されるスポットインスタンスの数) は増加しません。ただし、インスタンスに中断のリスクがあることをキャパシティーの再調整が検出した場合、Amazon EC2 Auto Scaling は直ちに新しいインスタンスの起動を試みます。その結果、リスクのあるインスタンスが中断された後に Amazon EC2 Auto Scaling が新しいインスタンスを起動するのを待つ場合よりも多くのインスタンスが置き換えられる可能性があります。

キャパシティーの再調整が有効になっているインスタンスをさらに置き換える可能性がありますが、インスタンスが中断される前にアクションを実行するための時間をより長く確保できるため、事後対応ではなくプロアクティブに対応できるというメリットがあります。スポットインスタンスの中断通知では、通常、インスタンスを正常にシャットダウンするための猶予期間が最大 2 分しかありません。キャパシティーの再調整で新しいインスタンスを事前に起動することで、既存のプロセスがリスクのあるインスタンスで完了する可能性が高くなり、インスタンスのシャットダウン手順を開始して、リスクのあるインスタンスで新しい作業がスケジュールされないようにできます。新しく起動したインスタンスの準備を開始して、アプリケーションを引き継ぐこともできます。キャパシティーの再調整のプロアクティブな置き換えにより、正常な継続性の恩恵を受けることができます。

キャパシティーの再調整を使用するリスクとメリットを示す理論的な例として、次のシナリオを検討してください。

  • 午後 2 時 – インスタンス A の再調整の推奨が受信され、Amazon EC2 Auto Scaling は直ちに代替インスタンス B の起動の試行を開始するため、シャットダウン手順を開始する時間を確保できます。

  • 午後 2 時 30 分 – インスタンス B の再調整の推奨が受信され、インスタンス C に置き換えられるため、シャットダウン手順を開始する時間を確保できます。

  • 午後 2 時 32 分 – キャパシティーの再調整が有効になっておらず、インスタンス A のスポットインスタンスの中断通知が午後 2 時 32 分に受信されていたとすれば、アクションを実行するための猶予期間は最大でも 2 分だけでしたが、インスタンス A はこの時間まで稼働していたことでしょう。

キャパシティーの再調整を有効にする

キャパシティーの再調整は、いつでも有効または無効にできます。

キャパシティーの再調整のを有効にする (コンソール)

Auto Scaling グループを作成または更新するときに、キャパシティーの再調整を有効または無効にできます。

新しい Auto Scaling グループのキャパシティーの再調整を有効にするには
  1. https://console.aws.amazon.com/ec2/ でAmazon EC2 コンソールを開き、ナビゲーションペインで [Auto Scaling グループ] を選択します。

  2. [Create Auto Scaling group] (Auto Scaling グループの作成) を選択します。

  3. ステップ 1 で、Auto Scaling グループの名前を入力し、起動テンプレートを選択してから、[Next] (次へ) を選択して次のステップに進みます。

  4. [Step 2: Choose instance launch options] (ステップ 2: インスタンス起動オプションを選択) の [Network] (ネットワーク) で、希望するオプションを選択します。

  5. [Instance type requirements] (インスタンスタイプの要件) で、混合インスタンスグループを作成する設定を選択します。これには、起動できるインスタンスタイプ、インスタンスの購入オプション、スポットインスタンスとオンデマンドインスタンスの配分戦略が含まれます。これらの設定はデフォルトで設定されていません。これらを設定するには、[Override launch template] (起動テンプレートを上書きする) を選択する必要があります。混合インスタンスグループの作成に関する詳細については、「複数のインスタンスタイプと購入オプションを使用する Auto Scaling グループ」を参照してください。

  6. ページ最下部の [Allocation strategies] (配分戦略) セクションで、スポット配分戦略を選択します。キャパシティーの再調整は、[Capacity rebalance] (キャパシティーの再調整) チェックボックスを選択または選択解除することで、有効または無効にします。このオプションは、[Instance purchase options] (インスタンスの購入オプション) セクションで Auto Scaling グループのスポットインスタンスとして起動される割合を指定する場合にのみ表示されます。

  7. Auto Scaling グループを作成します。

既存の Auto Scaling グループのキャパシティーの再調整を有効にするには
  1. https://console.aws.amazon.com/ec2/ でAmazon EC2 コンソールを開き、ナビゲーションペインで [Auto Scaling グループ] を選択します。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。

    [Auto Scaling groups] (Auto Scaling グループ) ページの下部にスプリットペインが開きます。

  3. [Details] (詳細) タブで、[Allocation strategies] (配分戦略)、[Edit] (編集) の順に選択します。

  4. [Allocation strategies] (割り当て戦略) セクションで、以下の操作を行います。

    • キャパシティーの再調整を有効にするには、[キャパシティーの再調整] チェックボックスを選択します。

    • キャパシティーの再調整を無効にするには、[キャパシティーの再調整] チェックボックスをクリアします。

  5. [Update] (更新) を選択します。

キャパシティーの再調整を有効にする (AWS CLI)

以下の例では、AWS CLIを使用してキャパシティーの再調整を有効または無効にする方法を示しています。

[create-auto-scaling-group] または [update-auto-scaling-group] コマンドに次のパラメータを指定して使用します。

  • --capacity-rebalance / --no-capacity-rebalance — キャパシティーの再調整が有効かどうかを示すブール値。

[create-auto-scaling-group] コマンドを呼び出す前に、Auto Scaling グループで使用するように設定されている起動テンプレートの名前が必要です。詳細については、「Auto Scaling グループの起動テンプレートを作成する」を参照してください。

注記

次の手順は、JSON または YAML でフォーマットされた設定ファイルの使用方法を示しています。AWS CLIバージョン 1 を使用する場合は、JSON 形式の設定ファイルを指定する必要があります。AWS CLIバージョン 2 を使用する場合は、YAML または JSON のいずれかでフォーマットされた設定ファイルを指定できます。

新しい Auto Scaling グループを作成して設定するには
  • 次の [create-auto-scaling-group] コマンドを使用して、新しい Auto Scaling グループを作成し、キャパシティーの再調整を有効にし、Auto Scaling グループの唯一のパラメータとして JSON ファイルを参照します。

    aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

    [混合インスタンス・ポリシー] を指定する CLI 設定ファイルがまだない場合は、作成します。

    次の行を設定ファイルのトップレベルの JSON オブジェクトに追加します。

    { "CapacityRebalance": true }

    次は、config.json ファイルの例です。

    { "AutoScalingGroupName": "my-asg", "DesiredCapacity": 12, "MinSize": 12, "MaxSize": 15, "CapacityRebalance": true, "MixedInstancesPolicy": { "InstancesDistribution": { "OnDemandBaseCapacity": 0, "OnDemandPercentageAboveBaseCapacity": 25, "SpotAllocationStrategy": "capacity-optimized" }, "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Default" }, "Overrides": [ { "InstanceType": "c5.large" }, { "InstanceType": "c5a.large" }, { "InstanceType": "m5.large" }, { "InstanceType": "m5a.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "m4.large" }, { "InstanceType": "c3.large" }, { "InstanceType": "m3.large" } ] } }, "TargetGroupARNs": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff", "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" }
新しい Auto Scaling グループを作成して設定するには
  • 次の [create-auto-scaling-group] コマンドを使用して、新しい Auto Scaling グループを作成し、キャパシティーの再調整を有効にし、Auto Scaling グループの唯一のパラメータとして YAML ファイルを参照します。

    aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml

    YAML でフォーマットされた設定ファイルに以下の行を追加します。

    CapacityRebalance: true

    次は、config.yaml ファイルの例です。

    --- AutoScalingGroupName: my-asg DesiredCapacity: 12 MinSize: 12 MaxSize: 15 CapacityRebalance: true MixedInstancesPolicy: InstancesDistribution: OnDemandBaseCapacity: 0 OnDemandPercentageAboveBaseCapacity: 25 SpotAllocationStrategy: capacity-optimized LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateName: my-launch-template Version: $Default Overrides: - InstanceType: c5.large - InstanceType: c5a.large - InstanceType: m5.large - InstanceType: m5a.large - InstanceType: c4.large - InstanceType: m4.large - InstanceType: c3.large - InstanceType: m3.large TargetGroupARNs: - arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
既存の Auto Scaling グループのキャパシティーの再調整を有効にするには
  • 以下の [update-auto-scaling-group] コマンドを使用して、キャパシティーの再調整を有効にします。

    aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --capacity-rebalance
Auto Scaling グループのキャパシティーの再調整を有効になっていることを確認するには
  • 以下の [describe-auto-scaling-group] コマンドを使用して、キャパシティーの再調整が有効になっていることを確認し、詳細を表示します。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

    以下に、応答の例を示します。

    { "AutoScalingGroups": [ { "AutoScalingGroupName": "my-asg", "AutoScalingGroupARN": "arn", ... "CapacityRebalance": true } ] }
キャパシティーの再調整を無効にするには

キャパシティーの再調整を無効にするには、[update-auto-scaling-group] コマンドに--no-capacity-rebalanceオプションを付けて使用します。

aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --no-capacity-rebalance

終了ライフサイクルフックを追加する

オプションで、キャパシティーの再調整を有効にするときに、終了ライフサイクルフックを設定します。ライフサイクルフックでは、インスタンスが終了される前に、それらでカスタムアクションを実行することができます。

以下は、終了ライフサイクルフックを使用するいくつかの理由です。

  • システムログまたはアプリケーションログを Amazon Simple Storage Service (Amazon S3) にアップロードするには

  • Amazon SQS ワーカーの正常なシャットダウンのために

  • ドメインネームシステム (DNS) からの登録解除を完了するには

終了ライフサイクルフックがない場合は、次の手順にしたがって終了ライフサイクルフックを作成します。

終了ライフサイクルフックを追加するには
  1. https://console.aws.amazon.com/ec2/ でAmazon EC2 コンソールを開き、ナビゲーションペインで [Auto Scaling グループ] を選択します。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。

    [Auto Scaling groups] (Auto Scaling グループ) ページの下部にスプリットペインが開きます。

  3. [Instance management (インスタンス管理)] タブの [Lifecycle hooks (ライフサイクルフック)] で、[Create lifecycle hook (ライフサイクルフックを作成)] を選択します。

  4. ライフサイクルフックを定義するには、以下を実行します。

    1. [Lifecycle hook name (ライフサイクルフック名)] で、ライフサイクルフックの名前を指定します。

    2. [Lifecycle transition (ライフサイクルの移行)] で、[Instance terminate (インスタンスの終了)] を選択します。

    3. [ハートビートのタイムアウト] には、ライフサイクルアクションを完了する必要がある時間、またはタイムアウト期間が終了するまでの時間を秒単位で指定します。アプリケーションをシャットダウンするために必要な時間に応じて、30~120 秒の値をお勧めします。

    4. [Default result] (デフォルトの結果) には、タイムアウト時間を超過した、または予期しない失敗が発生した場合に Auto Scaling グループが実行するアクションを指定します。[ABANDON] (中止) と [CONTINUE] (続行) は、どちらもインスタンスを終了します。

      • [CONTINUE] (続行) を選択する場合、Auto Scaling グループは、終了前に他のライフサイクルフックなどの残りのアクションを続行できます。

      • [ABANDON] (中止) を選択する場合、Auto Scaling グループはインスタンスをただちに終了します。

    5. (オプション) [Notification Metadata] (通知メタデータ) で、Amazon EC2 Auto Scaling が AWS Lambda 関数、またはステップ 6 で設定した別の通知ターゲットにメッセージを送信するときに含める追加の情報を指定します。

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

  6. (オプション) インスタンス終了前のカスタムアクションの実行に Lambda などのサービスを使用するには、「チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定」を参照してください。このチュートリアルは、ライフサイクルフックの Lambda 関数をセットアップする方法を理解するために役立ちます。それ以外の場合、EC2 インスタンスがアクションを自動的に実行するには、シャットダウンスクリプトを実行するように設定する必要があります。シャットダウンシーケンス全体が 1~2 分以内に完了するようにスクリプトを作成して、インスタンスの終了前にタスクを完了する十分な時間が確保されるようにすることをお勧めします。

ライフサイクルフックの使用に関するさまざまな側面を理解するために役立つ詳細情報については、「Amazon EC2 Auto Scaling のライフサイクルフック」を参照してください。

注記

キャパシティーの再調整は、Amazon EC2 Auto Scaling が使用可能なすべての商用 AWS リージョンで利用できます (中東 (アラブ首長国連邦) リージョンを除く)。