Fargate で Amazon ECS サービスの Auto Scaling を設定するにはどうすればよいですか?

最終更新日: 2021 年 4 月 6 日

AWS Fargate で Amazon Elastic Container Service (Amazon ECS) サービスの Auto Scaling を設定したいと考えています。

簡単な説明

Fargate で Amazon ECS を Amazon CloudWatch アラームおよび Application Auto Scaling と統合することで、タスクの必要数を増減できます。その後、CloudWatch メトリクスを使用して CloudWatch アラームを設定できます。

CloudWatch アラームが Auto Scaling ポリシーをトリガーすると、Application Auto Scaling は、設定されたスケーリングポリシーに基づいて新しい必要数を決定します。その後、Application Auto Scaling は、新しい必要数の値を使用して UpdateService API を Amazon ECS に呼び出します。Amazon ECS サービススケジューラは、新しい必要数を満たすためにタスクを起動またはシャットダウンします。スケーリングアクティビティは、必要数と実行数が同じになるまで、InProgress 状態のままです。

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

解決方法

Fargate サービス用に Service Auto Scaling を設定する

Amazon ECS コンソールでサービスを作成または更新する場合は、[Set Auto Scaling] (Auto Scaling を設定) ページから以下を選択します。

1.    [Configure Service Auto Scaling to adjust your service’s desired count] (Service Auto Scaling の設定を変更することで、サービスの必要数を調整する) を選択します。

2.    [Minimum number of tasks] (タスクの最小数) で、Service Auto Scaling で使用するタスクの最小数を入力します。

3.    [Desired number of tasks] (タスクの必要数) で、Service Auto Scaling で使用するタスクの数を入力します。

注: タスクの必要数は、最小タスク数と最大タスク数の範囲内である必要があります。

4.    [Maximum number of tasks] (タスクの最大数) で、Service Auto Scaling で使用するタスクの最大数を入力します。

注: タスクの最小数と最大数は、サービスのハードリミットです。

5.    [IAM role for Service Auto Scaling] (Service Auto Scaling 用の IAM ロール) で、ecsAutoscaleRole を選択します。

注: このロールが存在しない場合は、[Create new role] (新しいロールの作成) を選択して、コンソールでロールを作成します。

6.    [Automatic task scaling policies] (自動タスクスケーリングポリシー) セクションで、[Auto Scaling Policy] (Auto Scaling ポリシー) を選択します。

7.    セットアップウィザードの残りの手順を実行して、サービスを作成または更新します。

スケーリングポリシーを選択する

要件と以下の考慮事項に基づいて、ターゲット追跡ポリシーまたはステップスケーリングポリシーのいずれかを選択します。

ターゲット追跡ポリシーの場合:

  • 指定したメトリクスのターゲット値 (しきい値) を定義する必要があります。Application Auto Scaling は、スケーリングポリシーをトリガーする CloudWatch アラームを作成および管理します。
  • ECSServiceAverageCPUUtilizationECSServiceAverageMemoryUtilization、および ALBRequestCountPerTarget Amazon ECS サービスメトリクスを使用して、ターゲットの追跡を行うことができます。
  • ターゲット追跡ポリシーは、定義したメトリクスとターゲット値に基づいて、スケーリング調整 (つまり、タスクの必要数) を計算します。ステップスケーリングポリシーで行うように、スケーリングアクションを設定する必要はありません。これは、ターゲット追跡ポリシーによって、指定したターゲット値またはそれに近い状態でメトリクスを維持するために、必要に応じて容量を追加または削除するためです。
  • スケールアウトとスケールインのクールダウン期間を選択する必要があります。

ステップスケーリングポリシーの場合:

  • ステップスケーリング用の任意のメトリクスについて、既存の CloudWatch アラームを作成または使用できます。
  • スケーリングアクションまたはステップ調整 (ScalingAdjustmentMetricIntervalUpperBoundMetricIntervalLowerBound など) を選択する必要があります。
  • スケーリング調整の種類は、スケーラブルなターゲットの現在の容量に対するパーセンテージ、または絶対数を使用して指定できます。
  • スケールインおよびスケールアウトアクティビティを処理するスケーリングポリシーを作成して、タスクの必要数を増減できます。

注: 詳細については、ステップ 5: Service Auto Scaling を使用するようにサービスを設定するをご参照ください。

AWS CLI を使用して Service Auto Scaling を設定する

1.    Application Auto Scaling を使用して、Fargate サービスをスケーラブルなターゲットとして登録します。

aws application-autoscaling register-scalable-target \
--service-namespace ecs --scalable-dimension ecs:service:DesiredCount \
--resource-id service/your-cluster/your-service-name \
--min-capacity 1 --max-capacity 10 --region us-east-1

2.    スケーラブルなターゲット (つまり、Fargate サービス) のターゲット追跡またはステップスケーリングポリシーを作成します。

ターゲット追跡ポリシー:

ターゲット追跡ポリシーを作成します。

aws application-autoscaling put-scaling-policy \
--service-namespace ecs --scalable-dimension ecs:service:DesiredCount \
--resource-id service/<cluster>/<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}'

注: ターゲット追跡ポリシーを作成すると、Application Auto Scaling は、選択したターゲット値 (しきい値) に基づいてスケールインおよびスケールアウト用の CloudWatch アラームを作成します。

ステップスケーリングポリシー:

1.    必要なステップ調整を含むステップスケーリングポリシーを作成します。

aws application-autoscaling put-scaling-policy \
--service-namespace ecs --scalable-dimension ecs:service:DesiredCount \
--resource-id service/your-cluster/your-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"}'

2.    ステップ 1 のスケーリングポリシーをアラームアクションとして新規または既存の 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=your-cluster Name=ServiceName,Value=your-service-name --unit Percent \
--alarm-actions "arn:aws:autoscaling:us-east-1:xxxxxxx:scalingPolicy:xxxxxx/Test-Step-scaling-policy-ScaleOut"

3.    スケールインアクティビティ用に別のステップスケーリングポリシーと CloudWatch アラームを作成します。

注: サービスのスケールアウトアクティビティが進行中の場合、CloudWatch メトリクスによってトリガーされたスケールインアクティビティは、スケールアウトアクティビティが完了するまでブロックされます。Amazon ECS が Auto Scaling で設定した必要数を満たさないと、InProgress スケールアウトアクティビティがタイムアウトします。タイムアウトは、イメージやネットワークの問題など、さまざまな原因によって引き起こされる場合があります。スケールアウトのクールダウン期間中に CloudWatch メトリクスによってスケールインアクティビティがトリガーされたが、スケールアウトアクティビティが完了した場合、スケールインアクティビティが実行されます。