Comme vous l'avez probablement déjà vu sur le Cycle de vie des tâches il n'y a pas de PAUSED
donc non, il n'est pas possible de mettre en pause et de reprendre les Tâches.
La meilleure approche consiste à définir un politique d'autoscaling qui gère pour vous les Tâches actives, ce qui est parfait pour économiser sur la facture de CPU/Mémoire.
Comme votre cas d'utilisation nécessite ces conteneurs de temps en temps, l'astuce consiste à définir "comment puis-je comprendre quand j'en ai besoin". Par exemple, vous pourriez pousser quelque chose dans une file d'attente SQS et créer 2 Tasks uniquement lorsqu'il y a au moins un élément dans la file d'attente. Une fois qu'il a été traité, la politique d'autoscaling mettra fin à la tâche et vous ne paierez rien du tout.
En utilisant CloudFormation, vous pourriez définir votre service cible comme ceci :
ECSTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 2
MinCapacity: 0
ResourceId: !Join ["/", [service, !Ref MyCluster, !GetAtt [MyService, Name]]]
RoleARN: !GetAtt [ EcsAutoScalingRole, Arn ]
ScalableDimension: ecs:service:DesiredCount
ServiceNamespace: ecs
Définir les règles de mise à l'échelle vers le haut et vers le bas
ECSScaleUp:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: !Join ['-', ['MyService', 'ScaleUpPolicy']]
PolicyType: StepScaling
ScalingTargetId: !Ref ECSTarget
StepScalingPolicyConfiguration:
Cooldown: 30
MetricAggregationType: "Average"
AdjustmentType: "ExactCapacity"
StepAdjustments:
- MetricIntervalLowerBound: 0
ScalingAdjustment: 2
ECSScaleDown:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: !Join ['-', ['MyService', 'ScaleDownPolicy']]
PolicyType: StepScaling
ScalingTargetId: !Ref ECSTarget
StepScalingPolicyConfiguration:
Cooldown: 30
MetricAggregationType: "Average"
AdjustmentType: "ExactCapacity"
StepAdjustments:
- MetricIntervalUpperBound: -1
ScalingAdjustment: 0
Et ensuite définir une alarme pour déclencher l'autoscaling.
ECSSQSAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Join ['-', [!Ref 'MyService', 'SQSAlarm']]
AlarmDescription: "Trigger ECS Service Scaling based on SQS queue"
Namespace: "AWS/SQS"
MetricName: "ApproximateNumberOfMessagesVisible"
ComparisonOperator: "GreaterThanThreshold"
Dimensions:
- Name: QueueName
Value: !GetAtt [ MyQueue, QueueName]
EvaluationPeriods: 2
Period: 60
Statistic: 'Average'
Threshold: 1
AlarmActions:
- !Ref ECSWorkerScaleUp
- !Ref ECSWorkerScaleDown
OKActions:
- !Ref ECSWorkerScaleUp
- !Ref ECSWorkerScaleDown