3 votes

Suspendre un conteneur sur AWS Fargate

J'envisage de déployer des conteneurs Docker en utilisant AWS Elastic Container Service sur Fargate.

Je n'ai pas pu trouver d'informations utiles concernant la mise en pause des conteneurs docker et la facturation associée.

Est-il possible de mettre en pause les conteneurs Docker sur Fargate afin d'économiser la facture de CPU/mémoire ? Le cas d'utilisation est l'utilisation de conteneurs de temps en temps, mais ne pas vouloir respawn nouveaux conteneurs, juste pause et reprendre un existant. Quelque chose comme les snapshots de DigitalOcean.

1voto

Luca Stucchi Points 643

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X