キャパシティの再調整を使用して 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 が新しいスポットインスタンスを起動している間も、作業の処理を続行できます。

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

概要

Auto Scaling グループでキャパシティの再調整を使用するための基本的な手順は、以下のとおりです。

  1. 複数のインスタンスタイプとアベイラビリティーゾーンを使用するように Auto Scaling グループを設定します。そうすることで、Amazon EC2 Auto Scaling は各アベイラビリティーゾーンでスポットインスタンスの利用可能なキャパシティを検討できるようになります。詳細については、「複数のインスタンスタイプと購入オプションを使用する Auto Scaling グループ」を参照してください。

  2. 必要に応じてライフサイクルフックを追加して、再調整通知を受け取るインスタンス内でアプリケーションを正常にシャットダウンします。詳細については、「Amazon EC2 Auto Scaling のライフサイクルフック」を参照してください。

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

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

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

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

  3. ライフサイクルフックのカスタムアクションを開発します。カスタムアクションを呼び出すには、インスタンスの終了の準備が整ったタイミングを知る必要があります。インスタンスのライフサイクル状態を検出することでタイミングを確認します。

    • インスタンスの外部でアクションを呼び出すには、 EventBridge ルールを記述し、イベントパターンがルールに一致するときに実行するアクションを自動化します。

    • インスタンス内でアクションを呼び出すには、シャットダウンスクリプトを実行し、インスタンスのメタデータを介してライフサイクルスの状態を取得するようにインスタンスを設定します。

    カスタムアクションが 2 分以内に終了するように設計することが重要です。これにより、インスタンス終了前にタスクを完了するのに十分な時間が確保されます。

これらの手順を完了すると、キャパシティの再調整を使用できるようになります。

キャパシティーの再調整の動作

キャパシティの再調整では、インスタンスが再調整レコメンデーションを受け取ると、Amazon EC2 Auto Scaling は次のように動作します。

  • 新しいスポットインスタンスの起動時、Amazon EC2 Auto Scaling は、新しいインスタンスがヘルスチェックに合格するまで待機してから、以前のインスタンスを終了させます。複数のインスタンスを置き換える場合、以前の各インスタンスの終了は、新しいインスタンスが起動され、ヘルスチェックに合格してから開始されます。

  • Amazon EC2 Auto Scaling は以前のインスタンスを終了する前に新しいインスタンスの起動を試みるため、指定された最大キャパシティに到達している、またはそれに近い状態は、再調整アクティビティを妨げたり、それらを完全に停止させる可能性があります。この問題を回避するために、Amazon EC2 Auto Scaling は一時的にグループの最大サイズを必要なキャパシティの最大 10% まで超過できます。

  • Auto Scaling グループにライフサイクルフックを追加しなかった場合、Amazon EC2 Auto Scaling は、新しいインスタンスがヘルスチェックに合格すると同時に以前のインスタンスの終了を開始します。

  • ライフサイクルフックを追加した場合は、前のインスタンスの終了を開始するまでの時間が、ライフサイクルフックに指定したタイムアウト値だけ延長されます。

  • スケーリングポリシーまたはスケジュールされたスケーリングを使用している場合、スケーリングアクティビティは並行して実行されます。スケーリングアクティビティが進行中で、Auto Scaling グループが新しい希望キャパシティを下回っている場合、Amazon EC2 Auto Scaling はまずスケールアウトを行ってから、以前のインスタンスを終了します。

あるアベイラビリティーゾーンに該当するインスタンスタイプのキャパシティがない場合、Amazon EC2 Auto Scaling は他の有効なアベイラビリティーゾーンで成功するまでスポットインスタンスの起動を試行し続けます。

最悪のシナリオでは、新しいインスタンスの起動に失敗するか、ヘルスチェックに失敗すると、Amazon EC2 Auto Scaling はインスタンスの再起動を試行し続けます。  新しいインスタンスの起動試行中、以前のインスタンスは最終的に中断され、2 分間の中断通知により強制的に終了されます。

考慮事項

キャパシティの再調整を使用する場合は、次の点を考慮してください。

スポットの中断に耐えられるようにアプリケーションを設計する

アプリケーションはインスタンス数の動的な変化と、スポット インスタンスが早期に中断される可能性に対処する必要があります。例えば、Auto Scaling グループが Elastic Load Balancing ロードバランサーの背後にある場合、Amazon EC2 Auto Scaling は、インスタンスがロードバランサーから登録解除されるまで待機してから、終了ライフサイクルフックを呼び出します。インスタンスの登録解除とライフサイクルアクションの完了にかかる時間が長すぎる場合、Amazon EC2 Auto Scaling がインスタンスを終了させる前にライフサイクルアクションの完了を待機する間に、インスタンスが中断される可能性があります。

2 分間のスポットインスタンス中断通知の前に、Amazon EC2 が再調整のレコメンデーションシグナルを送信できるとは限りません。場合によっては、再調整のレコメンデーションシグナルが、2 分間の中断通知と同時に到着する可能性があります。この場合、Amazon EC2 Auto Scaling はライフサイクルフックを呼び出し、新しいスポットインスタンスをすぐに起動しようとします。

代替スポットインスタンスが中断されるリスクの増大を回避する

lowest-price 割り当て戦略を使用している場合、代替スポットインスタンスが中断されるリスクが高くなることがあります。これは、代替スポットインスタンスが起動後すぐに中断される可能性が高い場合も、その時点で利用可能なキャパシティを持つ最低料金のプールでインスタンスを起動することが原因です。中断のリスクが高まるのを避けるため、lowest-price の割り当て戦略を使用しないことを強くお勧めします。代わりに、price-capacity-optimized の使用をお勧めします。この戦略では、中断される可能性が最も低く、可能な限り低価格のスポットプールで代替スポットインスタンスを起動します。したがって、近い将来に中断される可能性は低くなります。

Amazon EC2 Auto Scaling は、可用性が同じかそれ以上の場合にのみ、新しいインスタンスを起動します

キャパシティ再調整の目的の 1 つは、スポットインスタンスの可用性を改善することです。既存のスポットインスタンスが再調整のレコメンデーションを受け取った場合、Amazon EC2 Auto Scaling は、新しいインスタンスが既存のインスタンスと同等かそれ以上の可用性を提供する場合にのみ新しいインスタンスを起動します。新しいインスタンスの中断のリスクが既存のインスタンスよりもひどい場合、Amazon EC2 Auto Scaling は新しいインスタンスを起動しません。ただし、Amazon EC2 Auto Scaling は引き続き Amazon EC2 スポットサービスから提供された情報に基づいてスポットキャパシティプールを評価し、可用性が向上した場合は新しいインスタンスを起動します。

Amazon EC2 Auto Scaling が新しいインスタンスをプロアクティブに起動しないと、既存のインスタンスが中断する可能性があります。中断が発生すると、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. [Auto Scaling グループの作成] を選択します。

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

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

  5. [ネットワーク] で、必要なオプションを選択します。使用するサブネットが、異なるアベイラビリティーゾーンにあることを確認します。

  6. [配分戦略] セクションで、スポット配分戦略を選択します。[容量の再分散] で、チェックボックスをオンまたはオフにして、容量の再分散を有効または無効にします。このオプションは、[インスタンスの購入オプション] セクションで Auto Scaling グループのスポットインスタンスとして起動するようにリクエストした場合にのみ表示されます。

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

  8. (オプション) 必要に応じてライフサイクルフックを追加します。詳細については、「ライフサイクルフックを追加する」を参照してください。

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

  2. Auto Scaling グループの横にあるチェックボックスを選択します。ページの下部にスプリットペインが開きます。

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

  4. [配分戦略] セクションで、[容量の再分散] チェックボックスをオンまたはオフにして、容量の再分散を有効または無効にします。

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

キャパシティの再調整を有効にする (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": "price-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: price-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

容量の再調整の詳細については、 AWS コンピューティングブログのEC2 Auto Scaling の新しい容量再調整機能を使用してスポットインスタンスのライフサイクルをプロアクティブに管理する」を参照してください。

EC2 インスタンスの再調整に関する推奨事項の詳細については、「Amazon EC2 ユーザーガイド」の「EC2 インスタンスの再調整に関する推奨事項」を参照してください。 Amazon EC2

ライフスタイルフックの詳細については、以下のリソースを参照してください。

制限事項

  • Amazon EC2 Auto Scaling は、インスタンスがスケールインから保護されていない場合のみ、再調整通知を受信したインスタンスを置き換えることができます。ただし、スケールイン保護はスポットの中断による終了を防ぐことはできません。詳細については、「インスタンスのスケールイン保護を使用する」を参照してください。

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