Amazon ECS キャパシティプロバイダーのスケーリングに関する問題をトラブルシューティングする方法を教えてください。
Amazon Elastic Container Service (Amazon ECS) クラスターのキャパシティプロバイダーを Amazon Elastic Compute Cloud (Amazon EC2) 起動タイプで作成したところ、そのキャパシティプロバイダーが期待どおりにスケーリングしません。
簡単な説明
次の問題が原因で、Amazon EC2 キャパシティプロバイダーが自動的にスケールインまたはスケールアウトできなくなります。
- Amazon ECS サービスがキャパシティプロバイダーに関連付けられていない。
- キャパシティプロバイダのスケーリングポリシーを Amazon EC2 Auto Scaling グループにアタッチしていない。
- ターゲットキャパシティのパーセンテージが正しく設定されていない。
- キャパシティプロバイダーにマネージドスケーリングを使用しており、EC2 Auto Scaling グループにカスタムスケーリングポリシーがアタッチされている。
- Amazon EC2 Auto Scaling グループがコンテナインスタンスを起動したが、クラスターに参加できない。
- コンテナインスタンスはスケールイン、スケールダウンすることができない。
- キャパシティプロバイダーが Failed 状態に留まっている。
- Auto Scaling グループがスケーリングループに陥っている。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon ECS サービスがキャパシティプロバイダーに関連付けられていることを確認する
Amazon ECS サービスがキャパシティプロバイダーに関連付けられているかどうかを確認するには、次の AWS CLI コマンド describe-services を実行します。
aws ecs describe-services --cluster example-cluster --services example-service --region example-region --query 'services[].capacityProviderStrategy'
注: お使いのものでそれぞれ、example-cluster をクラスターに、example-service をサービス名に、example-region を AWS リージョンに置き換えます。
Amazon ECS サービスがキャパシティプロバイダーに関連付けられている場合は、次の例のような出力が表示されます。
[ [ { "capacityProvider": "example-capacity-provider", "weight": 1, "base": 1 } ] ]
capacityProviderStrategy の値は、[] 以外である必要があります。
キャパシティプロバイダーをサービスに追加するには、次の update-service コマンドを実行します。
aws ecs update-service --cluster example-cluster --service example-service --region example-region --capacity-provider-strategy capacityProvider=capacity-provide-name,weight=weight-value,base=base-value --force-new-deployment
注: 実際のものでそれぞれ、example-cluster をクラスター名に、example-service をサービス名に、example-region をリージョンに、capacity-provider-name をキャパシティプロバイダー名に置き換えます。さらに、weight-value はキャパシティプロバイダーを使用するタスクの合計数に置き換え、base-value はキャパシティプロバイダーが実行する最小タスク数に置き換えます。
Amazon ECS コンソールを使用してサービスを更新することもできます。
キャパシティプロバイダーのスケーリングポリシーが Auto Scaling グループにアタッチされていることを確認する
キャパシティプロバイダーを Auto Scaling グループに関連付けると、Amazon ECS はクラスターの負荷に基づき、キャパシティを変更するスケーリングポリシーを作成します。
スケーリングポリシーの問題をトラブルシューティングするには、AWS CloudTrail イベントで API コール PutScalingPolicy、UpdateAutoScalingGroup、CreateCapacityProvider、UpdateCapacityProvider を確認します。ポリシーが Auto Scaling グループに関連付け可能であり、キャパシティプロバイダーが期待どおりに動作していることを確認します。
Auto Scaling グループがクラスターアタッチメントであることを確認するには、次の describe-cluster コマンドを実行します。
aws ecs describe-clusters --clusters example-cluster --include ATTACHMENTS --region example-region --query 'clusters[].attachments[]'
注: 実際のものでそれぞれ、example-cluster をクラスター名に、example-region をリージョンに置き換えます。
出力例
[ { "id": "100a23456-5f0b-4abc-b998-d6789d111a", "type": "as_policy", "status": "CREATED", "details": [ { "name": "capacityProviderName", "value": "example-capacityProvider" }, { "name": "scalingPlanName", "value": "ECSManagedAutoScalingPlan-bb60c8fa-3ed7-4808-b39c-abcdef2345" } ] } ]
マネージドスケーリングポリシーを使用している場合は、次の手順を実行し、ポリシーが Auto Scaling グループにアタッチ済みかどうかを確認します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] を選択します。
- クラスターを選択します。
- [インフラストラクチャ] タブを選択します。
- [キャパシティプロバイダー] タブを選択します。
- Auto Scaling グループを選択します。
注: このアクションにより、Amazon EC2 コンソールの [Auto Scaling グループ] ページにリダイレクトされます。 - [自動スケーリング] タブを選択します。
- [アクション] を選択し、[動的スケーリングポリシーの編集] を選択します。
- [カスタムメトリクス JSON] フィールドで、ポリシーに CapacityProviderReservation メトリクスが含まれていることを確認します。
ターゲットキャパシティのパーセンテージ設定を確認する
Amazon CloudWatch メトリクス CapacityProviderReservation でお使いのキャパシティプロバイダーを確認し、そのコンテナインスタンスの使用状況を追跡します。Auto Scaling Group に関連付けられたターゲット追跡スケーリングポリシーは、実行中のインスタンスの数を調整することで、CapacityProviderReservation をターゲットのキャパシティと一致させます。たとえば、ターゲットキャパシティを 100% に設定すると、Amazon ECS はすべてのインスタンスを使用し、タスクを実行していないインスタンスはスケールインします。
追加容量を設定するには、[ターゲットキャパシティの設定] を更新し、100 未満の値に変更します。
Auto Scaling グループから起動したインスタンスがクラスターに参加できることを確認します。
インスタンスがクラスターに参加できない場合は、「Amazon EC2 インスタンスが Amazon ECS クラスターに参加できない原因を教えてください」を参照してください。
コンテナインスタンスがスケールインまたはスケールダウンアクションから保護されていないことを確認する
マネージド削除保護を使用するキャパシティプロバイダーでは、スケールインアクション中のタスクによる Amazon EC2 インスタンスの削除は、Amazon ECS によりブロックされます。
実行中のすべてのタスクを停止し、Auto Scaling グループが EC2 インスタンスを削除できるようにするには、Amazon ECS コンソールを使用してインスタンスをドレインします。または、次の update-container-instances-state コマンドを実行します。
aws ecs update-container-instances-state --cluster example-cluster --container-instances example-container --status DRAINING --region example-region
注: 実際のものでそれぞれ、examples-cluster をクラスター名に、example-container をコンテナインスタンスに、example-region をリージョンに置き換えます。
ドレイン後もタスクがコンテナインスタンスで実行されている場合は、「コンテナインスタンスが DRAINING に設定されているときに、Amazon ECS タスクの停止に時間がかかる場合のトラブルシューティング方法を教えてください」を参照してください。
マネージド削除保護の問題をさらにトラブルシューティングする場合は、「Amazon ECS で発生する、キャパシティプロバイダーのマネージド削除保護に関するエラーを解決する方法を教えてください」を参照してください。
スケーリング保護によってインスタンスのスケールダウンアクションがブロックされた場合は、Auto Scaling アクティビティ履歴に次のエラーメッセージが表示されます。
"Could not scale to desired capacity because all remaining instances are protected from scale-in."
この問題を解決するには、使用するツールの設定、または Terraform や GitLab などのサードパーティツールを確認します。それらのツールによって、Auto Scaling グループから AmazonECSManaged タグが削除されていないことを確認してください。Amazon ECS がスケーリングを管理するには、このタグが必要です。AmazonECSManaged が欠けているかどうかを確認するには、CloudTrail イベント履歴で SetInstanceProtection イベントを確認します。SetInstanceProtection がある場合は、Auto Scaling グループにタグを復旧する必要があります。
キャパシティプロバイダーのステータスを確認する
キャパシティプロバイダーを使用する際には、既存のグループを再利用するのではなく、新しい Auto Scaling グループを作成するのがベストプラクティスです。既存のグループに関連付けられていて、Amazon ECS クラスターに登録されている Running 状態のインスタンスは、正しく登録されない場合があります。
キャパシティプロバイダーのステータスを確認するには、describe-capacity-providers コマンドを実行します。
aws ecs describe-capacity-providers \ --capacity-providers MyCapacityProvider
キャパシティプロバイダーのステータスが INACTIVE の場合、キャパシティプロバイダーは削除済みです。
さらに、CloudTrail イベントで CreateCapacityProvider API に関連するエラーの有無を確認します。
Auto Scaling グループがスケーリングループに陥っていないことを確認する
Amazon ECS サービスのスケーリングポリシーで指定したターゲットキャパシティが急増すると、Auto Scaling グループはスケールアウトしてインスタンスを起動します。ただし、突然の急増後にメトリクス値が下がった場合は、Auto Scaling グループはそのインスタンスをスケールインします。ターゲットキャパシティが短期間に頻繁に変動すると、Auto Scaling グループはスケーリングループに陥ります。この問題を回避するには、ワークロードに合わせてターゲットキャパシティ値を設定します。
関連情報
Amazon ECS クラスターの自動スケーリングに関する詳細
- トピック
- Containers
- 言語
- 日本語
