Amazon ECS のキャパシティープロバイダーでのスケーリング問題をトラブルシューティングする方法を教えてください。

最終更新日: 2022 年 4 月 14 日

Amazon Elastic Container Service (Amazon ECS) クラスター用のキャパシティープロバイダーをセットアップしました。しかし、キャパシティープロバイダーは、クラスターのリソースが不足してもスケールアウトせず、キャパシティーが十分にあってもスケールインしません。

簡単な説明

Amazon ECS クラスターのキャパシティープロバイダーが自動的にスケールインまたはスケールアウトしない原因として、次の 1 つ以上の理由が考えられます。

  • Amazon ECS サービスがキャパシティープロバイダーに関連付けられていない。
  • キャパシティープロバイダーに関連するスケーリングポリシーが Auto Scaling グループにアタッチされていない。
  • ターゲット追跡スケーリングポリシーが正しく設定されていない。
  • ターゲットキャパシティーパーセンテージがキャパシティープロバイダーで正しく設定されていない。
  • タスク配置戦略が、ワークロードに応じて定義されていない。
  • ECS サービスがいくつかのエラーで失敗し、キャパシティープロバイダーのスケーリングがブロックされている。
  • キャパシティープロバイダーにマネージドスケーリングを使用しており、Auto Scaling グループにカスタムスケーリングポリシーがアタッチされている。
  • Auto Scaling グループはコンテナインスタンスを起動したが、クラスターに参加できない。
  • コンテナインスタンスはスケールインから保護されている。
  • キャパシティープロバイダーが失敗状態のままになっている。
  • Auto Scaling グループが、スケールアウトとスケールインのループに陥っている。

解決方法

Amazon ECS サービスはキャパシティープロバイダーに関連付けられていません

ECS サービスがキャパシティープロバイダーに関連付けられているかどうかを確認するには、AWS Command Line Interface (AWS CLI) のコマンド describe-services を実行します。

aws ecs describe-services --cluster example-cluster --services example-service --region example-region --query services[].capacityProviderStrategy

ECS サービスがキャパシティープロバイダーに関連付けられている場合、出力は次のようになります。

[
  [
    {
      "capacityProvider": "example-capacity-provider",
      "weight": 1,
      "base": 1
    }
  ]
]

出力で capacityProviderStrategy フィールドが NULL でないことを確認してください。CreateService および UpdateService API コールの AWS CloudTrail イベントを確認することで、サービスの設定を表示できます。

この問題を解決するには、AWS CLI コマンド update-servicerun-task または put-cluster-capacity-providers を使用して ECS サービスを更新します。Amazon ECS コンソールを使用してサービスを更新することもできます。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

キャパシティープロバイダーが作成され、Auto Scaling グループに関連付けられると、Auto Scaling グループは、ターゲット追跡を使用してクラスターの負荷に対応するために希望のキャパシティーを変更するスケーリングポリシーを作成します。

この問題のトラブルシューティングを行うには、UpdateAutoScalingGroupCreateCapacityProviderUpdateCapacityProvider および PutScalingPolicy API の CloudTrail イベントをご確認ください。

次のコマンドを実行して、Auto Scaling グループがクラスターアタッチメントとして作成されていることを確認します。

aws ecs describe-clusters --clusters example-cluster --include ATTACHMENTS --region example-region --query clusters[].attachments[]

このコマンドの出力は、次のようになります。

[
  {
    "id": "100a23456-5f0b-4abc-b998-d6789d111a",
    "type": "asp",
    "status": "CREATED",
    "details": [
      {
        "name": "capacityProviderName",
        "value": "example-capacityProvider"
      },
      {
        "name": "scalingPlanName",
        "value": "ECSManagedAutoScalingPlan-bb60c8fa-3ed7-4808-b39c-abcdef2345"
      }
    ]
  }
]

マネージドスケーリングポリシーを使用している場合は、次の手順を実行して、そのポリシーが Auto Scaling グループにアタッチされているかどうかを確認します。

  1. Amazon ECS コンソールを開きます。
  2. ナビゲーションペインで、[Clusters] (クラスター) をクリックします。
  3. 確認するクラスターを開きます。
  4. [Capacity Providers] (キャパシティープロバイダー) タブを選択します。
  5. 確認するキャパシティープロバイダーで、ASG を選択します。
    Amazon EC2 コンソールの [Auto Scaling groups] (Auto Scaling グループ) ページが表示されます。
  6. [Automatic Scaling] (オートスケーリング) タブを選択します。
    スケーリングポリシーを表示できます。
  7. 使用しているスケーリングポリシーが含まれているかどうかを確認します。

また、Auto Scaling グループスケーリングポリシーの名前にプレフィックス AutoScaling-ECSManagedAutoScalingPlan を必ず含めてください。それ以外の場合、Auto Scaling グループはキャパシティープロバイダーが管理するスケーリングポリシーとは異なるスケーリングポリシーを使用します。キャパシティープロバイダーは、他のタイプのスケーリングポリシーと併用できます。詳細については、「サービスのオートスケーリング」を参照してください。

ターゲット追跡スケーリングポリシーが正しく設定されていない

ターゲット追跡スケーリングポリシーは、定義したメトリクスのターゲット値を追跡します。Amazon ECS サービスのオートスケーリングは、スケーリングポリシーをトリガーし、メトリクスとターゲット値に基づいてスケーリング調整を計算する Amazon CloudWatch アラームを作成して管理します。ターゲット追跡ポリシーが正しく設定されていないと、タスクが必要に応じて自動的にスケールされないことがあります。

ターゲット追跡オートスケーリングポリシーが CloudWatch の CPUUtilization メトリクスを追跡していて、ターゲット追跡割合を 60 に指定するとします。この場合、キャパシティープロバイダーはベストエフォートベースで合計 CPU 使用率を 60% に維持します。その結果、CPU 使用率が 60% を超えるとスケールアウトイベントが発生し、使用率が 60% 未満になるとスケールインイベントが発生します。

この問題を解決するには、ワークロードに基づいて適切なメトリクスを選択し、ターゲット追跡ポリシーで正しいスケールイン値とスケールアウト値を設定します。詳細については、「ターゲット追跡スケーリングポリシー」を参照してください。

ターゲットキャパシティーパーセンテージがキャパシティープロバイダーで正しく設定されていない

ターゲットキャパシティー値は、Amazon ECS が管理するターゲット追跡スケーリングポリシーで使用される CloudWatch メトリクスのターゲット値として使用されます。このターゲットキャパシティー値は、ベストエフォートベースで照合されます。この値に使用できる値は 1~100 の整数です。例えば、ターゲットキャパシティーを 100% に設定すると、すべてのインスタンスが使用され、タスクを実行していないインスタンスはすべてスケールインされます。ただし、この動作は常に保証されているわけではありません。予備のキャパシティーが必要な場合は、要件に基づいて 100% よりわずかに低い値にターゲットキャパシティーを設定します。

キャパシティープロバイダーを正しいターゲットキャパシティーパーセンテージで更新するには、「クラシックコンソールを使用して Auto Scaling グループのキャパシティープロバイダーを更新する」の手順に従います。

タスク配置戦略が、ワークロードに応じて定義されていない

タスク配置戦略は、サービスの作成時またはタスクの実行時に指定できます。また、既存のサービスのタスク配置戦略を更新することもできます。例えば、ワークロードがメモリを大量に消費し、それに応じてタスク配置戦略を設定しなかった場合、メモリ使用量に基づいてタスクがスケールインまたはスケールアウトされることはありません。タスク配置戦略タイプを確認し、ワークロードに応じてこれらの戦略を定義してください。

ECS サービスがいくつかのエラーで失敗し、キャパシティープロバイダーのスケーリングがブロックされている

ECS サービスがエラーで失敗した場合、キャパシティープロバイダーのスケールインとスケールアウトはブロックされます。ECS サービスが失敗した理由をトラブルシューティングするには、Amazon ECS コンソールでサービスイベントメッセージを確認します。

キャパシティープロバイダーにマネージドスケーリングを使用しており、Auto Scaling グループにカスタムスケーリングポリシーがアタッチされている

クラスターが自動的にスケーリングされない場合、次のエラーが表示されることがあります。

"StatusCode": "ActiveWithProblems"
"StatusMessage": "Scaling plan has been created but failed to be applied to all resources. Problems were encountered for 1 resource. See scaling plan resources for the failure details."
このエラーは、次の両方の条件に当てはまる場合に発生します。
  • キャパシティープロバイダーに AWS マネージドスケーリングを使用している。
  • Auto Scaling グループには、Amazon ECS によって作成されていないカスタムスケーリングポリシーがアタッチされている。

このエラーを解決するには、「ActiveWithProblems エラーの回避」を参照してください。マネージドスケーリングを有効にすると、Amazon ECS は Auto Scaling グループのスケールインおよびスケールアウトアクションを Auto Scaling スケーリングプランで管理します。常に新しい Auto Scaling グループを作成し、このグループをキャパシティープロバイダーにアタッチすることがベストプラクティスです。

Auto Scaling グループはコンテナインスタンスを起動したが、クラスターに参加できない

コンテナインスタンスはスケールインから保護されている

キャパシティープロバイダーを設定したときにマネージド終了保護を有効にした場合、Amazon ECS は、タスクを含む Auto Scaling グループ内の Amazon EC2 インスタンスがスケールインアクション中に終了されるのを防ぎます。

希望するキャパシティーを変更したときに Auto Scaling グループが古いインスタンスを確実に終了できるようにするには、次の手順を実行します。

詳細については、「Amazon ECS の「キャパシティープロバイダーのマネージド終了保護設定が無効です」というエラーを解決する方法を教えてください」を参照してください。

キャパシティープロバイダーが失敗状態のままになっている

既存のグループを使用する代わりに、キャパシティープロバイダーで使用する新しい Auto Scaling グループを作成するのがベストプラクティスです。既存の Auto Scaling グループを使用する場合、キャパシティープロバイダーの使用に問題がある可能性があります。これは、既存のグループに関連付けられ、Amazon ECS クラスターに登録されている、実行中状態の Amazon EC2 インスタンスが、キャパシティープロバイダーに正しく登録されていない可能性があるためです。

キャパシティープロバイダーのステータスを確認するには、AWS CLI コマンド describe-capacity-providers を実行します。

また、CloudTrail イベントを確認し、CreateCapacityProvider API に関連するエラーがないかを確認します。

Auto Scaling グループが、スケールアウトとスケールインのループに陥っている

ECS サービスのスケーリングポリシーで指定されているメトリクス値が急上昇すると、Auto Scaling グループはスケールアウトし、必要に応じてインスタンスを起動します。ただし、突然の急上昇後にメトリクスの値が下がると、Auto Scaling グループはインスタンスのスケールインを試みます。メトリクス値が短期間で数回変動すると、Auto Scaling グループがスケールアウトとスケールインのループに陥る可能性があります。この問題を回避するには、ワークロードに応じてスケーリングポリシーでメトリクスのしきい値を定義してください。