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

Amazon ECS クラスターの Auto Scaling

重要

2022 年 5 月 27 日以降、Amazon ECS ではリソースの管理方法が変更され、クラスターのオートスケーリングが容易になりました。詳細については、「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. キャパシティープロバイダーをクラスターに関連付ける

クラスターに関連付けられている各 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 グループでキャパシティープロバイダーを使用する場合、Amazon ECS が Auto Scaling グループをキャパシティープロバイダーと関連付ける際にタグを追加するため、キャパシティープロバイダーを作成する IAM ユーザーには autoscaling:CreateOrUpdateTags の許可が必要です。

    重要

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

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

  • マネージドスケーリングが有効になっている場合、キャパシティプロバイダーは、同時に 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 はクラスターに追加する最適なインスタンス数の下限を見積もり、この値を使用してリクエストするインスタンス数を決定します。以下では、スケールアウト動作について詳しく説明します。

  1. すべてのプロビジョニングタスクをグループ化し、各グループが同じリソース要件を持つようにします。

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

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

  4. Amazon ECSは、計算された最大インスタンス数が最小スケーリングステップサイズ、あるいは maximumScalingStepSize または計算された最大インスタンス数のいずれか小さい方の値よりも小さい場合、minimumScalingStepSize に関して、CapacityProviderReservation メトリクスを CloudWatch に公開します。

  5. CloudWatch アラームは、キャパシティープロバイダーの CapacityProviderReservation メトリクス (Amazon ECS によってパブリッシュされたもの) を消費しますが、値が targetCapacity 値を超えたときにのみ Auto Scaling グループの DesiredCapacity を増やします。targetCapacity 値は、クラスターの Auto Scaling がアクティブ化されているフェーズ中に CloudWatch アラームに送信されるキャパシティープロバイダー設定です。

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

  6. Auto Scaling グループは追加の EC2 インスタンスを起動します。スケールアウトオペレーションの過剰なプロビジョニングを防ぐため、オートスケーリングは、新しいインスタンスを起動する前に、最近起動された EC2 インスタンスのキャパシティを安定させます。オートスケーリングは、既存のすべてのインスタンスが instanceWarmupPeriod (現在はインスタンスの起動時間を減じたもの) を経過したかどうかを確認します。インスタンスが instanceWarmupPeriod 内にある場合、Amazon ECS は 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 は、クラスター内の各キャパシティープロバイダーのコンテナインスタンスを監視します。少なくとも 1 つのコンテナインスタンスに少なくとも 1 つの実行中のタスクがない場合、そのインスタンスは空と見なされ、Amazon ECS はスケールインプロセスをスタートします。次では、スケールイン動作について詳しく説明します。

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

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

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

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

    • すべてのコンテナインスタンスがキャパシティプロバイダーのマネージド終了保護を使用する場合、Amazon ECS はデーモン以外のタスクが実行されていないコンテナインスタンスのスケールイン保護を削除します。Auto Scaling グループは EC2 インスタンスを終了できるようになります。その後、コンテナインスタンスがクラスターから登録解除されます。

スケールインの考慮事項

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

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

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

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

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

マネージドスケーリングが有効な状態でキャパシティープロバイダーを作成または更新する場合、targetCapacity 値を設定できます。この値を使用すると、Auto Scaling グループが複数のインスタンスを起動するのを待たずに、将来のタスクをより迅速に起動できます。Amazon ECS では、ターゲットキャパシティー値を使用して、作成される CloudWatch メトリクスを管理できます。これにより、クラスターのオートスケーリングが容易になります。Amazon ECS は、Auto Scaling グループが定常状態として扱われるように CloudWatch メトリクスを管理します。こうすることで、スケーリングアクションが必要なくなります。値は 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 ではリソースの管理方法が変更され、クラスターのオートスケーリングが容易になりました。エクスペリエンスを簡素化するために、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」を参照してください。