暂停AWS Fargate上的容器

时间:2018-04-13 13:33:21

标签: amazon-web-services docker aws-fargate

我正计划在Fargate上使用AWS Elastic Container Service部署Docker容器。

我无法找到有关暂停泊坞容器和相关结算的任何有价值的信息。

是否可以在Fargate上暂停Docker容器,以便节省CPU /内存费用?用例是不时使用容器,但不想重新生成新容器,只需暂停并恢复现有容器即可。 类似于DigitalOcean的快照。

1 个答案:

答案 0 :(得分:0)

您可能已经在Task Lifecycle上看到过,没有PAUSED状态,所以没有,不可能暂停和恢复任务。

最好的方法是定义一个自动缩放策略,该策略可以为您管理活动的任务,并且非常适合节省CPU /内存费用。

由于您的用例会不时需要这些容器,因此诀窍是定义“如何理解我何时需要它们”。例如,您可以将某些内容推送到SQS队列中,仅在队列中至少有1个元素时才生成2个任务。处理完成后,自动缩放策略将终止该任务,您将完全不用支付任何费用。

使用CloudFormation,您可以这样定义目标服务:

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

定义放大和缩小的规则

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

然后定义一个警报以触发自动缩放

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