Auto Scaling
1 - Types de scaling ECS
2 - Target Tracking Scaling
Le plus simple et recommandé. Le service ajuste automatiquement le nombre de tasks pour maintenir une métrique cible.
2.1 Configuration
# CloudFormation
ScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 10
MinCapacity: 2
ResourceId: !Sub service/${ECSCluster}/${ECSService.Name}
RoleARN: !GetAtt AutoScalingRole.Arn
ScalableDimension: ecs:service:DesiredCount
ServiceNamespace: ecs
CPUTargetTracking:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: CPUTargetTracking
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref ScalableTarget
TargetTrackingScalingPolicyConfiguration:
TargetValue: 70.0
PredefinedMetricSpecification:
PredefinedMetricType: ECSServiceAverageCPUUtilization
ScaleInCooldown: 300
ScaleOutCooldown: 60
2.2 Métriques prédéfinies
| Métrique | Description |
|---|---|
ECSServiceAverageCPUUtilization | CPU moyen du service |
ECSServiceAverageMemoryUtilization | Mémoire moyenne |
ALBRequestCountPerTarget | Requêtes par task |
2.3 Métrique personnalisée
CustomMetricTargetTracking:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: CustomMetric
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref ScalableTarget
TargetTrackingScalingPolicyConfiguration:
TargetValue: 100
CustomizedMetricSpecification:
MetricName: QueueDepth
Namespace: MyApp
Statistic: Average
Dimensions:
- Name: QueueName
Value: orders-queue
ScaleInCooldown: 300
ScaleOutCooldown: 60
3 - Step Scaling
Plus de contrôle avec des seuils et des actions définies.
# CloudWatch Alarm
HighCPUAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: HighCPU
MetricName: CPUUtilization
Namespace: AWS/ECS
Statistic: Average
Period: 60
EvaluationPeriods: 2
Threshold: 80
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: ClusterName
Value: !Ref ECSCluster
- Name: ServiceName
Value: !GetAtt ECSService.Name
AlarmActions:
- !Ref ScaleUpPolicy
# Step Scaling Policy
ScaleUpPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: ScaleUp
PolicyType: StepScaling
ScalingTargetId: !Ref ScalableTarget
StepScalingPolicyConfiguration:
AdjustmentType: ChangeInCapacity
Cooldown: 60
MetricAggregationType: Average
StepAdjustments:
- MetricIntervalLowerBound: 0
MetricIntervalUpperBound: 20
ScalingAdjustment: 1
- MetricIntervalLowerBound: 20
ScalingAdjustment: 2
4 - Scheduled Scaling
Scaling basé sur un calendrier prévisible.
ScheduledScaleOut:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
# ...
ScheduledActions:
- ScheduledActionName: ScaleOutMorning
Schedule: "cron(0 8 * * ? *)" # 8h UTC
ScalableTargetAction:
MinCapacity: 5
MaxCapacity: 20
- ScheduledActionName: ScaleInNight
Schedule: "cron(0 22 * * ? *)" # 22h UTC
ScalableTargetAction:
MinCapacity: 2
MaxCapacity: 5
4.1 Via CLI
# Scale out le matin
aws application-autoscaling put-scheduled-action \
--service-namespace ecs \
--resource-id service/cluster-name/service-name \
--scalable-dimension ecs:service:DesiredCount \
--scheduled-action-name morning-scale-out \
--schedule "cron(0 8 * * ? *)" \
--scalable-target-action MinCapacity=5,MaxCapacity=20
5 - Multi-métrique scaling
Combiner plusieurs politiques pour un scaling précis.
# CPU Scaling
CPUScaling:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: CPUScaling
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref ScalableTarget
TargetTrackingScalingPolicyConfiguration:
TargetValue: 70
PredefinedMetricSpecification:
PredefinedMetricType: ECSServiceAverageCPUUtilization
# Request Count Scaling
RequestScaling:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: RequestScaling
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref ScalableTarget
TargetTrackingScalingPolicyConfiguration:
TargetValue: 1000
PredefinedMetricSpecification:
PredefinedMetricType: ALBRequestCountPerTarget
ResourceLabel: !Sub
- "${ALBFullName}/${TargetGroupFullName}"
- ALBFullName: !GetAtt ALB.LoadBalancerFullName
TargetGroupFullName: !GetAtt TargetGroup.TargetGroupFullName
6 - Capacity Providers Auto Scaling
Pour les clusters EC2, scaling automatique des instances.
ECSCluster:
Type: AWS::ECS::Cluster
Properties:
CapacityProviders:
- !Ref EC2CapacityProvider
DefaultCapacityProviderStrategy:
- CapacityProvider: !Ref EC2CapacityProvider
Weight: 1
EC2CapacityProvider:
Type: AWS::ECS::CapacityProvider
Properties:
AutoScalingGroupProvider:
AutoScalingGroupArn: !Ref ASG
ManagedScaling:
Status: ENABLED
TargetCapacity: 80
MinimumScalingStepSize: 1
MaximumScalingStepSize: 10
ManagedTerminationProtection: ENABLED
7 - IAM Role pour Auto Scaling
AutoScalingRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: application-autoscaling.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AutoScalingPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ecs:UpdateService
- ecs:DescribeServices
- cloudwatch:DescribeAlarms
- cloudwatch:PutMetricAlarm
- cloudwatch:DeleteAlarms
Resource: '*'
8 - Bonnes pratiques
8.1 Recommandations
| Aspect | Recommandation |
|---|---|
| Cooldown | Scale-out: 60s, Scale-in: 300s |
| Min capacity | Au moins 2 pour HA |
| Métriques | Combiner CPU et Request count |
| Monitoring | Alertes sur scaling events |
8.2 Éviter les problèmes
# Éviter le thrashing (scale up/down constant)
TargetTrackingScalingPolicyConfiguration:
TargetValue: 70
ScaleInCooldown: 300 # 5 minutes avant scale-in
ScaleOutCooldown: 60 # 1 minute avant scale-out
DisableScaleIn: false
8.3 Dashboard CloudWatch
ScalingDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardBody: !Sub |
{
"widgets": [
{
"type": "metric",
"properties": {
"title": "ECS Service Scaling",
"metrics": [
["AWS/ECS", "CPUUtilization", "ServiceName", "${ECSService.Name}", "ClusterName", "${ECSCluster}"],
[".", "DesiredCount", ".", ".", ".", "."],
[".", "RunningCount", ".", ".", ".", "."]
]
}
}
]
}
Résumé
Dans ce chapitre, nous avons appris :
- Le Target Tracking scaling (recommandé)
- Le Step Scaling pour plus de contrôle
- Le Scheduled Scaling pour les patterns prévisibles
- Le multi-métrique scaling
- Les Capacity Providers pour EC2
- Les bonnes pratiques de scaling
Prochaine étape
Dans le prochain chapitre, nous verrons le Monitoring et Logging.
→ Chapitre suivant : Monitoring et Logging