【问题标题】:AWS ECS long running jobs scale inAWS ECS 长时间运行的作业可扩展
【发布时间】:2018-01-09 06:13:30
【问题描述】:
我在 ECS 中的容器上运行了长时间运行的作业。当自动缩放触发器缩减时,有没有办法告诉 ECS 在 X 时间内(或直到触发事件)不终止任务,这样作业才能完成然后才终止?
假设我在 10 个实例上有 10 个容器,其中 3 个现在正在运行作业,我希望 ECS 不终止这些实例,并仅考虑剩余 7 个实例的规模。 ECS 支持这种东西吗?
【问题讨论】:
标签:
amazon-web-services
amazon-ec2
amazon-ecs
【解决方案1】:
没有办法向 ECS 发出信号,表示在缩小时应该跳过这十项中的特定任务。
但是,如果您的目标是不中断正在运行的任务,并给任务一个完成的机会,那么您可以使用基本的 Unix 原始概念来完成此任务。当 ECS 缩小时,它会告诉 Docker 守护进程停止您的容器,并且 docker 守护进程会向您容器中运行的进程发送一个 sigterm 信号。
每种运行时语言都可以捕获此信号并添加自定义处理。如果您没有自定义处理,则默认处理是让您的进程立即停止,但如果您捕获 sigterm 信号,那么您可以完成工作然后退出。
例如,在 node.js 中,你就是这样做的:
process.on('SIGTERM', function () {
server.close(function () {
process.exit(0);
});
});
此代码保持进程打开,直到服务器关闭所有连接,然后进程才会退出。
或者,如果您的业务流程需要很长时间,您可能会更好地使用 Amazon Batch(基本上是 Amazon ECS 之上的更高级别服务,旨在在集群上运行长时间运行的任务池,响应触发事件)。