Amazon ECS クラスターの Auto Scaling - Amazon Elastic Container Service

Amazon ECS クラスターの Auto Scaling

重要

2022 年 5 月 27 日以降、Amazon ECS ではリソースの管理方法が変更され、クラスターの Auto Scaling が容易になりました。詳細については、「Amazon ECS でクラスターのオートスケーリングのリソースを作成する方法に関する更新」を参照してください。

Amazon ECS では、クラスターに登録された Amazon EC2 インスタンスのスケーリングを管理できます。これは、Amazon ECS クラスターのオートスケーリングと呼ばれます。また、これはマネージドスケーリングが有効になっている Amazon ECS Auto Scaling グループのキャパシティープロバイダーを使用して行われます。マネージドスケーリングが有効な状態で Auto Scaling グループのキャパシティープロバイダーを使用すると、Amazon ECS は 2 つのカスタム CloudWatch メトリクス、および Auto Scaling グループにアタッチするターゲットの追跡スケーリングポリシーを作成します。Amazon ECS は、クラスターにかかるタスクの負荷に基づいて、Auto Scaling グループのスケールインアクションとスケールアウトアクションを管理します。Auto Scaling グループのキャパシティープロバイダーについての詳細は、「Auto Scaling グループキャパシティープロバイダー」を参照してください。

注記

Amazon ECS クラスターのオートスケーリングは、Auto Scaling グループのキャパシティプロバイダーを使用する場合にのみサポートされます。AWS Fargate でホストされている Amazon ECS ワークロードの場合は、「AWS Fargate キャパシティープロバイダー」を参照してください。

クラスターの Auto Scaling の仕組み

Amazon ECS クラスターのオートスケーリングのために使用されるワークフローを次に示します。詳細については、「クラスターの Auto Scaling をオンにする」を参照してください。

  1. Auto Scaling グループを作成する

  2. 作成した Auto Scaling グループを使用するキャパシティープロバイダーを作成する

  3. キャパシティープロバイダーのマネージドスケーリングを有効にする

  4. キャパシティープロバイダーをクラスターに関連付ける

  5. キャパシティプロバイダーを使用するキャパシティプロバイダー戦略を作成します。

    キャパシティープロバイダー戦略は、クラスターの複数のキャパシティープロバイダー間にタスクを分散する方法を決定します。スタンドアロンタスクを実行するか、サービスを作成するときは、クラスターのデフォルトのキャパシティプロバイダー戦略か、クラスターのデフォルト戦略をオーバーライドするキャパシティプロバイダー戦略のいずれかを使用します。

クラスターに関連付けられている各 Auto Scaling グループのキャパシティプロバイダーについて、Amazon ECS は次のリソースを作成し、管理します。

  • 低いメトリクス値の CloudWatch アラーム

  • 高いメトリクス値の CloudWatch アラーム

  • ターゲットの追跡スケーリングポリシー

    注記

    Amazon ECS は、ターゲットの追跡スケーリングポリシーを作成し、Auto Scaling グループにアタッチします。ターゲットの追跡スケーリングポリシーを更新するには、スケーリングポリシーを直接更新するのではなく、キャパシティプロバイダーのマネージドスケーリング設定を更新します。

マネージドスケーリングを無効にするか、クラスターからキャパシティプロバイダーの関連付けを解除すると、Amazon ECS は CloudWatch メトリクスとターゲットの追跡スケーリングポリシーのリソースの両方を削除します。

次のメトリクスは、実行するアクションを決定するのに役立ちます。

  • CapacityProviderReservation - 特定のキャパシティープロバイダーで使用されているクラスターコンテナインスタンスの割合。Amazon ECS はこのメトリクスを生成します。

  • DesiredCapacity - Auto Scaling グループのキャパシティー量。

Amazon ECS は、クラスターに関連付けられている各キャパシティプロバイダーに対して、クラスターの Auto Scaling プロセスを開始します。Amazon ECS は毎分、Auto Scaling グループがスケールインまたはスケールアウトする必要があるか判断するための情報を収集します。起動されたタスクが使用可能なインスタンスに配置できないときは、Auto Scaling グループは新しいインスタンスを起動してスケールアウトします。タスクのない実行中のインスタンスがあるときは、Auto Scaling グループは、実行中のタスクのないインスタンスを終了することによってスケールインします。

Amazon ECS は、CapacityProviderReservation メトリクスを実行し、メトリクスを CloudWatch の AWS/ECS/ManagedScaling 名前空間にパブリッシュします。CapacityProviderReservation メトリクスは、次のいずれかのアクションを実行します。

  • CapacityProviderReservation 値が 100% と等しい - Auto Scaling グループはスケールインまたはスケールアウトする必要はありません。これは、すべてのコンテナインスタンスが少なくとも 1 つの非デーモンタスクを実行しているためです。

  • CapacityProviderReservation 値が 100% より大きい - 起動したタスクに使用可能なインスタンスはありません。CapacityProviderReservation メトリクスは CloudWatch アラームを生成します。このアラームは Auto Scaling グループの DesiredCapacity 値を更新します。Auto Scaling グループはこの値を使用して EC2 インスタンスを起動し、クラスターに登録します。

  • CapacityProviderReservation 値が 100% 未満 - デーモン以外のタスクを実行していないコンテナインスタンスが少なくとも 1 つあります。CapacityProviderReservation メトリクスは CloudWatch アラームを生成します。このアラームは Auto Scaling グループの DesiredCapacity 値を更新します。Auto Scaling グループはこの値を使用して EC2 コンテナインスタンスを終了し、クラスターから登録解除します。

クラスターの Auto Scaling に関する考慮事項

クラスターの Auto Scaling を使用するときは、次の点を考慮してください。

  • キャパシティプロバイダーに関連付けられている Auto Scaling グループが希望するキャパシティは、Amazon ECS が管理しているもの以外のスケーリングポリシーを変更または管理しないでください。

  • Amazon ECS は、ユーザーに代わって AWS Auto Scaling を呼び出すために必要なアクセス許可として AWSServiceRoleForECS サービスにリンクされた IAM ロールを使用します。Amazon ECS サービスにリンクされた IAM ロールの使用と作成の詳細については、「Amazon ECS のサービスリンクロールの使用」を参照してください。

  • Auto Scaling グループでキャパシティプロバイダーを使用する場合、キャパシティプロバイダーを作成するユーザー、グループ、ロールには autoscaling:CreateOrUpdateTags アクセス許可が必要です。これは、Auto Scaling グループが、キャパシティープロバイダーに関連付けるときに、Amazon ECS が Auto Scaling グループにタグを追加するためです。

    重要

    ツールの使用により AmazonECSManaged タグが Auto Scaling グループから削除されないようにしてください。このタグが削除されると、Amazon ECS はクラスターをスケールするときにタグを管理できません。

  • クラスターの Auto Scaling は、グループの [MinimumCapacity][MaximumCapacity] を変更しません。グループをスケールアウトするには、[MaximumCapacity] を 0 より大きくする必要があります。

  • Auto Scaling (マネージドスケーリング) がオンになっている場合、キャパシティプロバイダーは、同時に 1 つのクラスターにしか接続できません。キャパシティープロバイダーがマネージドスケーリングをオフにしている場合は、複数のクラスターに関連付けることができます。

  • マネージドスケーリングがオフの場合、キャパシティプロバイダーはスケールインまたはスケールアウトを実行しません。キャパシティプロバイダー戦略を使用して、キャパシティプロバイダー間でタスクのバランスを取ることができます。

  • Amazon ECS は現時点の既存のキャパシティーにおける配置戦略と配置制約を使用します。配置戦略は、アベイラビリティーゾーンまたは Amazon ECS インスタンス間でタスクを分散できます。これによって、すべてのタスクとすべてのインスタンスが分散され、実行中の各タスクが独自のハードウェア専有インスタンスで起動されます。これを防ぐには、spread 戦略と binpack 戦略を併用しないようにします。詳細については、「Amazon ECS タスク配置戦略」を参照してください。

新しいコンソールを使用する際には、次の点を検討してください。

  • Amazon ECS マネージドスケーリング機能はデフォルトでオンになっています。詳細については、「マネージドスケールアウト動作」を参照してください。

  • マネージドターミネーションはデフォルトでオフになっています。

  • Auto Scaling インスタンスのスケールイン保護はデフォルトでオフになっています。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「インスタンスのスケールイン保護の使用」を参照してください。

  • キャパシティプロバイダーで使用する Auto Scaling グループは、インスタンスの重み付け設定を使用することはできません。Amazon ECS キャパシティプロバイダーと同時に使用すると、インスタンスの重み付けはサポートされません。

マネージド終了保護

Auto Scaling インスタンスのスケールイン保護は、終了できる EC2 インスタンスを制御します。スケールインプロセス中、スケールイン機能がオンになっているインスタンスを終了することはできません。マネージド型の終了保護を使用している場合に Amazon ECS が終了できるのは、Amazon ECS タスクを実行していない EC2 インスタンスのみです。マネージド終了保護を使用するときは、Amazon ECS は最初に Auto Scaling グループの EC2 インスタンスのスケールイン保護オプションをオンにします。次に、インスタンスにタスクを配置します。デーモン以外のすべてのタスクがインスタンスで停止すると、Amazon ECS はスケールインプロセスを開始し、EC2 インスタンスのスケールイン保護をオフにします。Auto Scaling グループはインスタンスを終了できます。

マネージド終了保護の考慮事項

新しいコンソールでマネージド終了保護を使用する場合は、以下のことを考慮してください:

  • Auto Scaling グループは、マネージドインスタンス保護とマネージドスケーリングを使用するために自動的に設定されます。

  • Auto Scaling インスタンスのスケールイン保護はデフォルトでオフになっています。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「インスタンスのスケールイン保護の使用」を参照してください。

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

マネージドスケーリングを使用する Auto Scaling グループキャパシティプロバイダーがあるとき、Amazon ECS はクラスターに追加する最適なインスタンス数を見積もります。次に、Amazon ECS はこの値を使用して、リクエストするインスタンスの数を決定します。以下では、スケールアウト動作について詳しく説明します。

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

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

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

  3. AS; グループ内の複数のインスタンスタイプを使用する場合、Auto Scaling グループ内のインスタンスタイプはパラメータによってソートされます。これらのパラメータには vCPU、メモリ、Elastic Network Interface (ENI)、ポート、GPU が含まれます。各パラメータの最小インスタンスタイプと最大インスタンスタイプが選択されます。インスタンスタイプの選択方法の詳細については、「Amazon ECS ベストプラクティスガイド」の「Characterizing your application」(アプリケーションの特性を知る) を参照してください。

    重要

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

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

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

  5. Amazon ECS は、次のいずれかに該当する場合、minimumScalingStepSize に関連した CloudWatch に CapacityProviderReservation メトリクスをパブリッシュします。いずれの場合も、計算された最大インスタンス数が最小スケーリングステップサイズを下回っています。または、maximumScalingStepSize か、計算された最大インスタンス数のどちらか低い方の値。

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

    Auto Scaling グループを作成するとき、またはグループの作成後に値を変更するときに targetCapacity を設定できます。デフォルトでこの値は 100% に設定されています。

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

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

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

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

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

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

  2. マネージドスケーリングは、Auto Scaling グループが同じインスタンスタイプまたは類似のインスタンスタイプを使用している場合に最適です。詳細については、「マネージドスケールアウト動作」を参照してください。

  3. スケールアウトプロセスが必要で、使用可能なコンテナインスタンスがないときに、コンテナインスタンスが利用可能になると、Amazon ECS は常に 200% (2 つのインスタンス) にスケールアウトします。

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

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

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

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

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

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

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

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

  2. Amazon ECS は、CapacityProviderReservation 値を、100 から空のコンテナインスタンスの数を引いた値に設定します。例えば、空のコンテナインスタンスの数が 2 の場合、値は 98% です。その後、Amazon ECS は CloudWatch にメトリクスをパブリッシュします。

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

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

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

スケールインの考慮事項

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

  • Amazon ECS コンテナインスタンスは、実行中のデーモン以外のタスクがない場合、スケールインに使用できると見なされます。

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

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

ターゲットの追跡に関する考慮事項

マネージドスケーリングが有効な状態でキャパシティプロバイダーを作成または更新する場合、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 つのタスクを実行するように強制しますが、これは望ましい動作ではない可能性があります。この動作を防ぐには、spread 戦略と binpack 戦略を併用しないようにします。

Amazon ECS でクラスターのオートスケーリングのリソースを作成する方法に関する更新

2022 年 5 月 27 日以降、Amazon ECS ではリソースの管理方法が変更され、クラスターの Auto Scaling が容易になりました。エクスペリエンスを簡素化するために、Amazon ECS では Auto Scaling グループのキャパシティプロバイダーでマネージドスケーリングが有効な場合、AWS Auto Scaling スケーリングプランが必要ではなくなりました。この変更がクラスターの Auto Scaling のワークフローに機能的な影響を与えたり、価格やパフォーマンスに影響することはありません。

2022 年 5 月 27 日より前に作成され、AWS Auto Scaling スケーリングプランを使用しているキャパシティプロバイダーは、引き続き機能します。

次の考慮事項を確認してください。

  • キャパシティプロバイダーに関連付けられた ECS-managed AWS Auto Scaling スケーリングプランまたはスケーリングポリシーのリソースは、更新または削除することはお勧めしません。

  • Auto Scaling コンソールやアタッチメント付き describe-clusters で、クラスター用のスケーリングプランのリソースにアクセスできます。詳細については、「API ドキュメント」の「DescribeClusters」を参照してください。

  • クラスターキャパシティプロバイダーとして機能する Auto Scaling グループにスケーリングポリシーを追加することはできません。

  • アカウントごとの Auto Scaling プランの数は限られています。詳細については、Amazon EC2 Auto Scaling ユーザーガイドの「スケーリングプランのクォータ」を参照してください。

2022 年 5 月 27 日以降、Amazon ECS では、新しく作成されたキャパシティープロバイダー用の AWS Auto Scaling スケーリングプランが作成されなくなりました。代わりに、Auto Scaling グループにアタッチされたターゲットの追跡スケーリングポリシーを使用して、ターゲット容量の仕様に基づき動的スケーリングが実行されます。詳細については、「Auto Scaling グループキャパシティープロバイダー」を参照してください。

この新しいリリースでは、新しいキャパシティプロバイダーを作成する際に使用するスケーリングポリシーを持つ既存の Auto Scaling グループを使用できます。ECS マネージドスケーリングポリシーまたはプランのリソースを変更することはお勧めしません。ただし、新しいキャパシティープロバイダーのリソースを作成する際に、AWS Auto Scaling スケーリングプランに変更を加えたカスタム済みのツールがある場合は、次のいずれかを実行します。

  • (推奨) キャパシティープロバイダーを更新して、Amazon ECS マネージドスケーリング設定を変更する。詳細については、「UpdateCapacityProvider」を参照してください。

  • Auto Scaling グループに関連付けられているスケーリングポリシーを更新して、使用するターゲットの追跡設定を変更する。詳細については、「PutScalingPolicy」を参照してください。