Amazon ECS のキャパシティープロバイダーでのスケーリング問題をトラブルシューティングする方法を教えてください。
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-service、run-task または put-cluster-capacity-providers を使用して ECS サービスを更新します。Amazon ECS コンソールを使用してサービスを更新することもできます。
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
キャパシティープロバイダーに関連するスケーリングポリシーが Auto Scaling グループにアタッチされていない
キャパシティープロバイダーが作成され、Auto Scaling グループに関連付けられると、Auto Scaling グループは、ターゲット追跡を使用してクラスターの負荷に対応するために希望のキャパシティーを変更するスケーリングポリシーを作成します。
この問題のトラブルシューティングを行うには、UpdateAutoScalingGroup、CreateCapacityProvider、UpdateCapacityProvider および 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 グループにアタッチされているかどうかを確認します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで、[Clusters] (クラスター) をクリックします。
- 確認するクラスターを開きます。
- [Capacity Providers] (キャパシティープロバイダー) タブを選択します。
- 確認するキャパシティープロバイダーで、ASG を選択します。
Amazon EC2 コンソールの [Auto Scaling groups] (Auto Scaling グループ) ページが表示されます。 - [Automatic Scaling] (オートスケーリング) タブを選択します。
スケーリングポリシーを表示できます。 - 使用しているスケーリングポリシーが含まれているかどうかを確認します。
また、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 グループはコンテナインスタンスを起動したが、クラスターに参加できない
- この問題の考えられる原因を確認するには、「クラスターのオートスケーリングに関する考慮事項」を参照してください。
- DescribeContainerInstances API コールの CloudTrail イベントを確認して、コンテナインスタンスがキャパシティープロバイダーに関連付けられているかどうかを確認します。
- Auto Scaling グループの最大値が 0 より大きい値に設定されていることを確認します。
コンテナインスタンスはスケールインから保護されている
キャパシティープロバイダーを設定したときにマネージド終了保護を有効にした場合、Amazon ECS は、タスクを含む Auto Scaling グループ内の Amazon EC2 インスタンスがスケールインアクション中に終了されるのを防ぎます。
希望するキャパシティーを変更したときに Auto Scaling グループが古いインスタンスを確実に終了できるようにするには、次の手順を実行します。
- キャパシティープロバイダーのマネージド終了保護を無効にします。
- 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 グループがスケールアウトとスケールインのループに陥る可能性があります。この問題を回避するには、ワークロードに応じてスケーリングポリシーでメトリクスのしきい値を定義してください。
関連情報
関連するコンテンツ
- 質問済み 3年前lg...
- 質問済み 7ヶ月前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 4年前
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前