每天在特定时间上下扩展 AWS ECS Fargate

问题描述 投票:0回答:3

我有一个 ECS Fargate 服务设置,需要在工作时间(即上午 9 点到下午 5 点)扩展到 2 个额外任务,否则我只需要运行 1 个任务。

我已经尝试过计划任务,但随后我将无法使用我与“应用程序负载均衡器”一起使用的原始 ECS 服务。

我还尝试了 ECS 服务自动扩展 - 使用自定义 CloudWatch 警报进行“逐步扩展”。但我不知道有什么简单的方法来创建在特定时间触发的警报,因为 ECS Step 扩展不接受 EventBridge 规则。

amazon-web-services amazon-ecs amazon-cloudwatch
3个回答
9
投票

您可以使用计划缩放:

aws application-autoscaling put-scheduled-action --service-namespace ecs \
    --scalable-dimension ecs:service:DesiredCount \
    --resource-id service/${CLUSTER_NAME}/${SERVICE_NAME} \
    --scheduled-action-name ${DESIRED_ACTION_NAME} \
    --schedule "cron(cron-expression-to-add-here)" \ 
    --scalable-target-action MinCapacity=${MIN_CAPACITY_NEEDED_AT_DESIRED_TIME},MaxCapacity=${MAX_CAPACITY_NEEDED_AT_DESIRED_TIME}

您可以了解更多有关

put-scheduled-action
这里

的信息

4
投票

计划任务将不起作用,因为这些任务不是您服务的一部分。 ECS 计划任务适用于自行运行和退出的计划后台任务,而不是无限期运行的服务。

ECS 服务 Auto Scaling 是用于此目的的正确功能。不幸的是,Web 界面落后于服务的实际功能,并且目前不允许您配置计划的扩展事件。

您目前必须使用 AWS CLI 工具等工具通过 API 进行配置。您需要创建一个引用 ECS 服务的

DesiredCount
设置的 AWS Application Autoscaling 目标。然后,您将需要创建多个 AWS Application Autoscaling 计划操作来更改 cron 计划上的最小/最大容量值。

我在使用 Terraform 之前已经这样做过,所以我知道这是可能的。我强烈建议使用 Terraform 来配置它以及基础设施的其余部分。据我所知,当设置 ECS 计划自动扩展时,配置不会出现在 AWS Web 界面的任何位置。目前 ECS 和应用程序自动缩放 Web 界面似乎完全缺少该功能。


0
投票

这是在 cloudformation 中执行此操作的示例 - 扩展我们仅在工作时间需要的服务。请注意,我在澳大利亚,所以 crontab 是 GMT+10

ServiceAdmin:
  Type: AWS::ECS::Service
  Properties:
    etc etc 

ServiceScalableTargetAdmin:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 3
    MinCapacity: 1
    ResourceId: !Join
      - /
      - - service
        - ecs-cluster-admin
        - !GetAtt ServiceAdmin.Name
    RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService
    ScalableDimension: ecs:service:DesiredCount
    ServiceNamespace: ecs
    # scale down admin environment overnight/weekends.  check it like this : aws application-autoscaling describe-scheduled-actions --service-namespace ecs
    ScheduledActions:
      - ScalableTargetAction:
          MaxCapacity: 0
          MinCapacity: 0
        Schedule: "cron(0 0 9 ? * MON-FRI *)"  #  that's 1900 MON-FRI brisbane time (2000 sydney summertime)
        ScheduledActionName: !Sub ${AWS::StackName}-scale-down-overnight
      - ScalableTargetAction:
          MaxCapacity: 3
          MinCapacity: 1
        Schedule: "cron(0 0 19 ? * MON-FRI *)"  #  that's 0700 MON-FRI brisbane time (0800 sydney summertime)
        ScheduledActionName: !Sub ${AWS::StackName}-scale-up-business-hours
  
© www.soinside.com 2019 - 2024. All rights reserved.