我有一个 ECS Fargate 服务设置,需要在工作时间(即上午 9 点到下午 5 点)扩展到 2 个额外任务,否则我只需要运行 1 个任务。
我已经尝试过计划任务,但随后我将无法使用我与“应用程序负载均衡器”一起使用的原始 ECS 服务。
我还尝试了 ECS 服务自动扩展 - 使用自定义 CloudWatch 警报进行“逐步扩展”。但我不知道有什么简单的方法来创建在特定时间触发的警报,因为 ECS Step 扩展不接受 EventBridge 规则。
您可以使用计划缩放:
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
这里的信息
计划任务将不起作用,因为这些任务不是您服务的一部分。 ECS 计划任务适用于自行运行和退出的计划后台任务,而不是无限期运行的服务。
ECS 服务 Auto Scaling 是用于此目的的正确功能。不幸的是,Web 界面落后于服务的实际功能,并且目前不允许您配置计划的扩展事件。
您目前必须使用 AWS CLI 工具等工具通过 API 进行配置。您需要创建一个引用 ECS 服务的
DesiredCount
设置的 AWS Application Autoscaling 目标。然后,您将需要创建多个 AWS Application Autoscaling 计划操作来更改 cron 计划上的最小/最大容量值。
我在使用 Terraform 之前已经这样做过,所以我知道这是可能的。我强烈建议使用 Terraform 来配置它以及基础设施的其余部分。据我所知,当设置 ECS 计划自动扩展时,配置不会出现在 AWS Web 界面的任何位置。目前 ECS 和应用程序自动缩放 Web 界面似乎完全缺少该功能。
这是在 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