Amazon ECS が終了するインスタンスの制御 - Amazon Elastic Container Service

Amazon ECS が終了するインスタンスの制御

重要

クラスター自動スケーリングのマネージドターミネーション保護機能を使用するには、Auto Scaling グループで自動スケーリングインスタンスのスケールイン保護を有効にする必要があります。

マネージド終了保護を使用すると、クラスターの自動スケーリングで、どのインスタンスを終了するかを制御できます。マネージド終了保護を使用した場合、Amazon ECS は、実行中の Amazon ECS タスクがない EC2 インスタンスのみを終了します。DAEMON スケジューリング戦略を使用するサービスによって実行されるタスクは無視され、インスタンスがこれらのタスクを実行している場合でも、クラスター自動スケーリングによってインスタンスを終了できます。これは、クラスター内のすべてのインスタンスがこれらのタスクを実行しているためです。

Amazon ECS は最初に Auto Scaling グループの EC2 インスタンスに対するインスタンススケールイン保護オプションを有効にします。次に、Amazon ECS がインスタンスにタスクを配置します。デーモン以外のすべてのタスクがインスタンスで停止すると、Amazon ECS はスケールインプロセスを開始し、EC2 インスタンスのスケールイン保護をオフにします。Auto Scaling グループはインスタンスを終了できます。

自動スケーリングインスタンスのスケールイン保護は、終了できる EC2 インスタンスを制御します。スケールイン機能がオンになっているインスタンスは、スケールインプロセス中に終了できません。自動スケーリングのインスタンススケールイン保護についての詳細は、「Amazon EC2 Auto Scaling ユーザーガイド」の「インスタンススケールイン保護を使用する」を参照してください。

キャパシティに余裕を持たせるように targetCapacity の割合を設定できます。こうすると、Auto Scaling グループが起動するインスタンスが増えないため、以降のタスクがより速く起動します。Amazon ECS では、ターゲットキャパシティー値を使用して、サービスによって作成される CloudWatch メトリクスを管理します。Amazon ECS は CloudWatch メトリクスを管理します。Auto Scaling グループが定常状態として扱われるため、スケーリングアクションが必要なくなります。値は 0-100% の範囲で指定できます。例えば、Amazon ECS タスクで使用されるキャパシティーに加えて 10% の空き容量を維持するように Amazon ECS を設定するには、ターゲットキャパシティー値を 90% に設定します。キャパシティプロバイダーで targetCapacity 値を設定する際には、次の点を考慮します。

  • 100% 未満の targetCapacity 値は、クラスター内に必要な空き容量 (Amazon EC2 インスタンス) を表します。空き容量とは、実行中のタスクがないことを意味します。

  • アベイラビリティーゾーンなどの配置制約は、追加の binpack がなければ、Amazon ECS が最終的にインスタンスごとに 1 つのタスクを実行するように強制しますが、これは望ましい動作ではない可能性があります。

マネージド終了保護を使用するには、Auto Scaling グループで 自動スケーリングインスタンスのスケールイン保護を有効にする必要があります。スケールイン保護を有効にしていない場合、マネージド終了保護を有効にすると、望ましくない動作が発生する可能性があります。例えば、インスタンスのドレイン状態のままになっている場合を考えてみます。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「インスタンスのスケールイン保護の使用」を参照してください。

キャパシティープロバイダーで終了保護を使用するときは、キャパシティープロバイダーに関連付けられた Auto Scaling グループで、インスタンスのデタッチなどの手動アクションを実行しないでください。手動操作を行うと、キャパシティープロバイダーのスケールイン操作が中断される可能性があります。Auto Scaling グループからインスタンスをデタッチする場合は、Amazon ECS クラスターからもデタッチしたインスタンスを登録解除する必要があります。

マネージドスケールアウト動作

マネージドスケーリングを使用する Auto Scaling グループキャパシティプロバイダーがある場合、Amazon ECS はクラスターに追加する最適なインスタンス数を見積もり、この値を使用してリクエストするインスタンス数を決定します。

Amazon ECS は、サービス、スタンドアロンタスク、またはクラスターのデフォルトからのキャパシティープロバイダー戦略に従って、各タスクのキャパシティープロバイダーを選択します。Amazon ECS は、単一のキャパシティプロバイダーのために、これらの残りのステップに従います。

キャパシティプロバイダー戦略のないタスクはキャパシティプロバイダーによって無視されます。キャパシティプロバイダー戦略がない保留中のタスクによって、キャパシティプロバイダーがスケールアウトされることはありません。タスクまたはサービスが起動タイプを設定する場合、タスクまたはサービスはキャパシティプロバイダー戦略を設定できません。

以下では、スケールアウト動作について詳しく説明します。

  • このキャパシティプロバイダーのすべてのプロビジョニングタスクをグループ化し、各グループが同じリソース要件を持つようにします。

  • グループ内の複数のインスタンスタイプを使用する場合、Auto Scaling グループ内のインスタンスタイプはパラメータによってソートされます。これらのパラメータには vCPU、メモリ、Elastic Network Interface (ENI)、ポート、GPU が含まれます。各パラメータの最小インスタンスタイプと最大インスタンスタイプが選択されます。インスタンスタイプの選択方法の詳細については、「Amazon ECS 用の Amazon EC2 コンテナインスタンス」を参照してください。

    重要

    タスクのグループに、Auto Scaling グループの最小のインスタンスタイプよりも大きなリソース要件がある場合、そのタスクのグループは、このキャパシティプロバイダーでは実行できません。キャパシティプロバイダーは、Auto Scaling グループをスケールしません。タスクは PROVISIONING 状態のままです。

    タスクが PROVISIONING 状態にとどまらないようにするには、最小リソース要件ごとに個別の Auto Scaling グループとキャパシティプロバイダーを作成することをお勧めします。タスクを実行するか、サービスを作成するときは、Auto Scaling グループ内の最小インスタンスタイプでタスクを実行できるキャパシティプロバイダーのみをキャパシティプロバイダー戦略に追加します。他のパラメータでは、配置制約を使用できます

  • タスクグループごとに、Amazon ECS は未配置タスクの実行に必要なインスタンス数を計算します。この計算には、binpack 戦略が用いられます。この戦略では、タスクの vCPU、メモリ、Elastic Network Interface (ENI)、ポートや GPU の要件を考慮します。また、Amazon EC2 インスタンスのリソースの可用性も考慮されます。最大インスタンスタイプの値は、計算された最大インスタンス数として扱われます。最小のインスタンスタイプの値は、保護として使用されます。最小インスタンスタイプでタスクの少なくとも 1 つのインスタンスを実行できない場合、計算ではタスクが互換性がないと見なされます。その結果、タスクはスケールアウト計算から除外されます。すべてのタスクに最小のインスタンスタイプとの互換性がないときは、クラスター 自動スケーリングは停止し、CapacityProviderReservation 値は targetCapacity のままになります。

  • Amazon ECS は、次のいずれかに該当する場合、minimumScalingStepSize に関連した CloudWatch に CapacityProviderReservation メトリクスをパブリッシュします。

    • 計算された最大インスタンス数が最小スケーリングステップサイズを下回っています。

    • maximumScalingStepSize か、計算された最大インスタンス数のどちらか低い方の値。

  • CloudWatch アラームは、キャパシティプロバイダーの CapacityProviderReservation メトリクスを使用します。CapacityProviderReservation メトリクスが targetCapacity 値より大きい場合、アラームでは、Auto Scaling グループの DesiredCapacity も増加します。targetCapacity 値は、クラスターの自動スケーリングがアクティブ化されているフェーズ中に CloudWatch アラームに送信されるキャパシティプロバイダー設定です。

    デフォルトの targetCapacity は 100 % です。

  • Auto Scaling グループは追加の EC2 インスタンスを起動します。オーバープロビジョニングを防ぐため、Auto Scaling では、最近起動された EC2 インスタンスのキャパシティが新たなインスタンスを起動する前に安定させています。自動スケーリングは、既存のすべてのインスタンスが instanceWarmupPeriod (現在はインスタンスの起動時間を減じたもの) を経過したかどうかを確認します。instanceWarmupPeriod 内にあるインスタンスのスケールアウトはブロックされます。

    新しく起動されたインスタンスがウォームアップに達するまでのデフォルト秒数は 300 です。

詳細については、「Amazon ECS のクラスター自動スケーリングに関する詳細な説明」を参照してください。

スケールアウトの考慮事項

スケールアウトのプロセスでは、次の点を考慮してください。

  • 配置制約は複数ありますが、distinctInstance タスク配置の制約事項のみを使用することをお勧めします。サンプリングされたインスタンスと互換性がない配置制約を使用しているため、これにより、スケールアウトプロセスが停止するのを防ぐことができます。

  • マネージドスケーリングは、Auto Scaling グループが同じインスタンスタイプまたは類似のインスタンスタイプを使用している場合に最適です。

  • スケールアウトプロセスが必要で現在実行中のコンテナインスタンスがない場合は、Amazon ECS は常に 2 つのインスタンスにスケールアウトしてから追加のスケールアウト/インプロセスを実行します。追加のスケールアウトは、インスタンスのウォームアップ期間を待ちます。スケールインプロセスの場合、Amazon ECS はスケールアウトプロセスの後 15 分待ってから、常にスケールインプロセスを開始します。

  • 2 番目のスケールアウトのステップは instanceWarmupPeriod が期限切れになるまで待つ必要があるため、全体的なスケール制限に影響する可能性があります。この時間を短縮する必要がある場合は、instanceWarmupPeriod が EC2 インスタンスが Amazon ECS エージェントを起動して開始するのに十分な大きさであることを確認してください (オーバープロビジョニングを防げます)。

  • クラスターの自動スケーリングは、キャパシティプロバイダーの Auto Scaling グループ内の起動設定、起動テンプレート、複数のインスタンスタイプをサポートします。複数のインスタンスタイプを使用せずに、属性ベースのインスタンスタイプの選択も使用できます。

  • オンデマンドインスタンスと複数のインスタンスタイプ、またはスポットインスタンスを持つ Auto Scaling グループを使用する場合は、大きいインスタンスタイプを優先順位リストで上位に配置し、ウェイトを指定しないでください。現時点では、ウェイトの指定はサポートされていません。詳細については、AWS Auto Scalingユーザーガイドの「複数のインスタンスタイプと Auto Scaling グループ」を参照してください。

  • Amazon ECS は、計算された最大インスタンス数が最小スケーリングステップサイズより小さい場合は minimumScalingStepSize を、あるいは maximumScalingStepSize または計算された最大インスタンスカウント値のいずれか小さい方を起動します。

  • Amazon ECS サービスまたは run-task がタスクを起動し、キャパシティープロバイダーのコンテナインスタンスにタスクを開始するために十分なリソースがない場合、Amazon ECS は、各クラスターでこのステータスのタスク数を制限し、タスクがこの制限を超えることを防ぎます。詳細については、「Amazon ECS の Service Quotas」を参照してください。

マネージドスケールイン動作

Amazon ECS は、クラスター内の各キャパシティプロバイダーのコンテナインスタンスをモニタリングします。コンテナインスタンスがタスクを実行していない場合、コンテナインスタンスは空であるとみなされ、Amazon ECS はスケールインプロセスを開始します。

CloudWatch スケールインアラームは、Auto Scaling グループのスケールインプロセスが開始する前に 15 データポイント (15 分) を必要とします。スケールインプロセスがスタートされた後から Amazon ECS が登録されたコンテナインスタンス数を減らす必要があるまで、Auto Scaling グループは DesireCapacity 値を 1 つのインスタンスより大きく、かつ毎分 50% 未満に設定します。

Amazon ECS がスケールアウトをリクエストしたときに (CapacityProviderReservation が 100 より大きいとき) スケールインプロセスが進行中の場合、スケールインプロセスは停止して、必要に応じて最初から開始されます。

次では、スケールイン動作について詳しく説明します。

  1. Amazon ECS は、空のコンテナインスタンスの数を計算します。デーモンタスクが実行されている場合でも、コンテナインスタンスは空であるとみなされます。

  2. Amazon ECS では、CapacityProviderReservation 値を 0 ~ 100 の数値に設定します。この数値は、Auto Scaling グループが必要とする規模と実際の規模との比率をパーセンテージで表す次の式を使用します。その後、Amazon ECS は CloudWatch にメトリクスをパブリッシュします。メトリクスの算出方法の詳細については、「Amazon ECS クラスター自動スケーリングのDeep Dive」を参照してください。

    CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
  3. CapacityProviderReservation メトリクスは CloudWatch アラームを生成します。このアラームは Auto Scaling グループの DesiredCapacity 値を更新します。すると、以下のいずれかのアクションが発生します。

    • キャパシティプロバイダーによるマネージド終了を使用しない場合、Auto Scaling グループは、Auto Scaling グループ終了ポリシーを使用して EC2 インスタンスを選択し、EC2 インスタンス数が DesiredCapacity に達するまでインスタンスを終了します。その後、コンテナインスタンスがクラスターから登録解除されます。

    • すべてのコンテナインスタンスがマネージド型の終了保護を使用している場合、Amazon ECS は空のコンテナインスタンスのスケールイン保護を削除します。Auto Scaling グループは EC2 インスタンスを終了できるようになります。その後、コンテナインスタンスがクラスターから登録解除されます。