AWS Fargate で Amazon Elastic Container Service (Amazon ECS) サービスの自動スケーリングを設定したいと考えています。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon CloudWatch アラームが自動スケーリングを開始すると、Application Auto Scaling はスケーリングポリシーを使用して新しい目標数を決定します。次に、Application Auto Scaling は Amazon ECS に対し、desiredCount パラメータに新しい値を指定して UpdateService API コールを開始します。Amazon ECS サービススケジューラーは、新しい目標数に合わせてタスクを起動または停止します。スケーリングアクティビティは、新しい木奇数と実行数が同じになるまで InProgress 状態に留まります。
Amazon ECS コンソールまたは AWS CLI を使用すると、Fargate に Amazon ECS Auto Scaling を設定できます。サービスの自動スケーリング構成を設定する AWS Identity and Access Management (IAM) ユーザーには、動的スケーリングをサポートするサービスへのアクセス許可が必要です。詳細については、「Amazon ECS サービスの自動スケーリングに必須の IAM アクセス許可」を参照してください。
Amazon ECS コンソールを使用する
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- [サービスの自動スケーリング] を選択し、オプション [サービスの自動スケーリングを使用する] を選択します。
- サービスの自動スケーリングに次の値を入力します。
[最小タスク数] に目標とする最小タスク数を入力します。
[最大タスク数] に目標とするタスクの最大数を入力します。
注: 目標数は、最小数を下回ったり、最大数を上回ったりすることはできません。
- ターゲット追跡スケーリングポリシーを作成するか、ステップスケーリングポリシーを作成して Amazon ECS に追加します。
AWS CLI を使用する
次の register-scalable-target コマンドを実行し、Fargate を Application Auto Scaling に対するスケーラブルターゲットとして登録します。
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/CLUSTER_NAME/SERVICE_NAME \
--min-capacity 1 --max-capacity 10 --region REGION
注: 実際のものでそれぞれ、CLUSTER_NAME をクラスターに、SERVICE_NAME をサービスに、REGION AWS リージョンに置き換えてください。
次に put-scaling-policy を実行し、Fargate 用のターゲット追跡スケーリングポリシーまたはステップスケーリングポリシーをスケーラブルターゲットとして作成します。作成した JSON ファイルをコマンドに含めます。
ターゲット追跡スケーリングポリシーのコマンド例:
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/CLUSTER_NAME/SERVICE_NAME \
--policy-name Test-target-tracking-scaling-policy --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{ "TargetValue": 75.0, "PredefinedMetricSpecification": {"PredefinedMetricType": "ECSServiceAverageCPUUtilization" }, "ScaleOutCooldown": 60,"ScaleInCooldown": 60}'
注: 実際のものでそれぞれ、CLUSTER_NAME をクラスターに、SERVICE_NAME サービスに、REGION をリージョンに置き換えてください。アプリケーションの Auto Scaling は、目標値に基づいてスケーリングに対する CloudWatch アラームを作成します。
ステップスケーリングポリシーのコマンド例:
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/CLUSTER_NAME/SERVICE_NAME \
--policy-name Test-Step-scaling-policy-ScaleOut --policy-type StepScaling \
--step-scaling-policy-configuration '{"AdjustmentType": "ExactCapacity","StepAdjustments": [ { "MetricIntervalLowerBound": 20, "ScalingAdjustment": 10}, { "MetricIntervalLowerBound": 0, "MetricIntervalUpperBound": 20,"ScalingAdjustment": 5}],"Cooldown": 60, "MetricAggregationType": "Average"}'
注: 実際のものでそれぞれ、CLUSTER_NAME をクラスターに、SERVICE_NAME サービスに、REGION をリージョンに置き換えてください。
ステップスケーリングポリシーを作成した場合は、次の put-metric-alarm コマンドを実行してスケーリングポリシーを CloudWatch アラームに追加します。次に、前のステップを繰り返して 2 番目のステップのスケーリングポリシーおよび、スケーリングアクティビティに対する CloudWatch アラームを作成します。
aws cloudwatch put-metric-alarm \
--alarm-name Test-ScaleOut --metric-name MemoryUtilization \
--namespace AWS/ECS \
--statistic Average --period 60 --threshold 60 \
--comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --datapoints-to-alarm 1 \
--dimensions Name=ClusterName,Value=CLUSTER_NAME Name=ServiceName,Value=SERVICE_NAME --unit Percent \
--alarm-actions "arn:aws:autoscaling:us-east-1:xxxxxxx:scalingPolicy:xxxxxx/Test-Step-scaling-policy-ScaleOut"
注: 実際のものでそれぞれ、CLUSTER_NAME をクラスターに、SERVICE_NAME サービスに、REGION をリージョンに置き換えてください。
アクティビティのスケールアウト中、アプリケーションの Auto Scaling はスケールアウトが完了するまで、すべてのスケールインアクティビティをブロックします。設定した数が満たされなかった場合、Amazon ECS は InProgress 状態のスケールアウトアクティビティをタイムアウトさせます。イメージやネットワークの問題により、タイムアウトが発生する場合があります。CloudWatch メトリクスがスケールアウトのクールダウン期間中にスケールインし、スケールアウトアクティビティが完了した場合、Application Auto Scaling はスケールインアクティビティを実行します。
関連情報
Amazon ECS でのサービス自動スケーリングに関するトラブルシューティング
Amazon ECS サービスを自動的にスケーリングする
DescribeScalingActivities
application-autoscaling