为了降低成本,我想停止并在群集中间任务中启动容器实例。任务一次又一次地运行,因此保持EC2在中间运行似乎并不有效。
允许此操作的最佳方式是什么?
我已经研究过cloudwatch调度程序触发的lambda函数,并考虑过自动缩放。
答案 0 :(得分:0)
亚马逊并没有让这个令人难以置信的直截了当(尽管他们正试图用Fargate)。现在最好的解决方案(如果你不在Fargate是一个选项的区域)是试图让你想要的任务数量与自动缩放组中你想要的实例数一致。
我们设置它的方式是通过Lambda,基于Autoscaling事件触发(非常容易设置)。关于这一点的最不重要的部分是Lambda脚本,尽管它并不难以置信。向ASG添加标签,以帮助确定与其关联的集群/服务。当缩放事件触发您的脚本时,只需让您的脚本描述触发它的ASG,查找标签中的集群/服务,并更新所需的服务计数:
asgDetail = paginator_describe_asg.paginate(
AutoScalingGroupNames=[
asgName,
]
)
# set service desired count equal to ASG desired capacity
newDesiredCount = iter(asgDetail).next()['AutoScalingGroups'][0]['DesiredCapacity']
response = client_ecs.update_service(
cluster = <ecs cluster>,
desiredCount = newDesiredCount,
service = <ecs service>
)
您不应该依赖CloudWatch的原因是因为它在粒度扩展方面做得不好。我的意思是,CloudWatch在您的ASG上监控的CPU是整体组平均值(我认为)。所以我们遇到的情况如下:
虽然这是一个简单的例子,但很容易看出实例数量与实际运行的任务数量之间的不同步(也就是说,您可能最终因主机处于空闲状态而因为ECS未检测到它需要更多的能力。)
我们可以扩展3台主机吗?当然,但ECS可能仍然只放置2个任务(取决于每个任务的使用情况)。我们可以一次扩展一个主机吗?当然,但是很难解释爆发。
所有这一点,我现在推荐的最佳解决方案是使用Lambda脚本帮助保持您的ASG实例数= =您的ECS服务所需的任务数。
答案 1 :(得分:0)
我决定创建一个启动实例的lambda函数,并在容器实例启动时运行一个任务。然后我有一个云观察事件,观察任务更改状态为STOPPED,触发另一个停止实例的lambda。