【问题标题】:AWS ECS. How to ensure only one instance of a task is running?AWS ECS。如何确保只有一个任务实例在运行?
【发布时间】:2020-09-21 16:15:29
【问题描述】:

我想设置一个 ECS 任务来安排其他各种应用程序任务。

此任务将安排的“任务”主要涉及在另一个负载平衡服务中调用 restful 端点。

我知道还有其他方法可以做到这一点,使用 cloudwatch 触发 lambda 等。但是这对于我的需要来说似乎过于复杂。

我打算只用一个 crontab 制作一个非常简单、轻量级的基于 apline 的图像来触发 restful 调用。

这一切似乎都很容易。我唯一担心的是,我想尽可能地防止该任务的多个实例运行,即使只是很短的一段时间。

如果我的 CI/CD 管道触发了对此 cron 任务的更新,那么可能会有一小段时间,新旧任务将同时运行。

因此,一个 cron 任务被触发两次的可能性很小。

我想做的是让 ECS 在尝试启动新任务之前完全停止当前正在运行的任务。

这似乎与它想要的正常工作方式相反,它会确保新任务已启动,并且在停止旧任务之前运行良好。

这可能吗?如果可以,我该如何配置?

如果我的 crons 有一段时间没有运行,这不是问题,但如果任何一个被多次触发,则可能是一个问题。

【问题讨论】:

    标签: amazon-ecs


    【解决方案1】:

    而不是使用 ECS 服务(它确保特定数量的任务始终在运行并通过滚动或 B/G 部署策略进行部署,这不是您想要的) - 如何使用 StopTask 和 RunTask api 来控制任务何时执行停止和启动 - 让您完全控制。

    【讨论】:

    • 是的,这样就可以了。我还可以将它集成到 CodePipeline 中,让它在部署新版本时自动停止任务,然后重新开始。我现在实际上更倾向于更强大的 SQS 解决方案,因为我有 cloudwatch 规则和 lambda 工作,但这可能是一个后备选项。
    【解决方案2】:

    您可以创建一个 ECS 服务并使用 scheduled scaling 将所需的服务计数缩放到 1 并返回到零,而不是使用计划任务。

    【讨论】:

    • 我可以看到这在某些情况下会有什么帮助。但是,对于我的特殊情况,我有许多不同的应用程序“任务”要以不同的时间间隔运行。我认为您的建议将需要每个应用程序“任务”的 ECS 任务,这可能会变得有点难以管理。我最终使用 cloudwatch 规则和 lambda 来管理时间表。最初的设置需要更多的努力,但总的来说似乎是最灵活和“正确”的方法。
    • 我投了赞成票,因为这个建议实际上让我了解了如何为我的应用程序的其他部分优化 ECS 资源。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2017-10-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多