Aller au contenu principal

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étriqueDescription
ECSServiceAverageCPUUtilizationCPU moyen du service
ECSServiceAverageMemoryUtilizationMémoire moyenne
ALBRequestCountPerTargetRequê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

AspectRecommandation
CooldownScale-out: 60s, Scale-in: 300s
Min capacityAu moins 2 pour HA
MétriquesCombiner CPU et Request count
MonitoringAlertes 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


← Retour à la table des matières