AWS ECS 长期运行的作业缩减

api*_*nes 1 amazon-ec2 amazon-web-services amazon-ecs

我在 ECS 中的容器上运行了长时间运行的作业。当自动缩放触发缩放时,有没有办法告诉 ECS 在 X 时间内(或直到触发事件)不终止任务,以便作业可以完成然后才终止?

假设我在 10 个实例上有 10 个容器,其中 3 个正在运行作业,我希望 ECS 不终止这些实例,并仅考虑剩余 7 个实例的规模。ECS支持这样的东西吗?

nat*_*eck 6

无法向 ECS 发出信号,表明在扩展时应跳过 10 项中的此特定任务。

但是如果你的目标是不中断正在运行的任务,并给任务一个完成的机会,那么你可以使用基本的 Unix 原始概念来实现这一点。当 ECS 缩减时,它会告诉 Docker 守护进程停止您的容器,并且 docker 守护进程向在您的容器中运行的进程发送一个 sigterm 信号。

每种运行时语言都有一种方法来捕获此信号并添加自定义处理。如果您没有自定义处理,默认处理是让您的进程立即停止,但如果您捕获 sigterm 信号,那么您可以完成工作然后退出。

例如,在 node.js 中,您可以这样做:

process.on('SIGTERM', function () {
  server.close(function () {
    process.exit(0);
  });
});
Run Code Online (Sandbox Code Playgroud)

此代码使进程保持打开状态,直到服务器关闭所有连接,然后进程才会退出。

或者,如果您的业务流程需要很长时间,您可以通过使用 Amazon Batch 之类的东西(基本上是 Amazon ECS 之上的更高级别的服务,旨在在集群上运行长时间运行的任务池,以响应触发事件)。