适用于每天一次的批处理流程中的AWS Fargate,Batch与ECS

时间:2018-10-15 16:19:17

标签: amazon-ecs aws-fargate

我有一个批处理过程,用PHP编写并嵌入到Docker容器中。基本上,它从多个Web服务加载数据,对数据进行一些计算(在大约1小时内),然后将计算后的数据发布到另一个Web服务,然后容器退出(如果正常,返回码为0,如果过程中某个地方失败,则返回1。 )。在此过程中,一些日志会写在STDOUT或STDERR上。该批次必须每天触发一次。

我想知道用于计划,执行和监视批处理过程的最佳AWS服务是什么:

  • 在一开始,我使用的是具有crontab的 EC2机器:此处没有高可用性功能,因此我决定改用更多PaaS方法。
  • 然后,我使用的是用于Docker的Elastic Beanstalk ,该服务器具有无法正常运行的Web服务器(仅用于答复Healthcheck),并且在容器内使用Crontab一次唤醒了我的批处理命令天。使用自动缩放规则min = 1 max = 1,我具有HA(如果容器崩溃或VM崩溃,则由AWS重新启动)
  • 但是现在,为了提高效率,我决定移至某些 ECS服务,并采用一种方法,无需让EC2实例不费吹灰之力地23/24唤醒。所以我尝试了Fargate。
  • 使用 Fargate ,我定义了任务(Fargate类型,而不是EC2类型),并配置了所有内容。
  • 我创建一个集群来运行我的任务:我可以“手动一次”运行我的任务,因此我知道每个设置都是正确的。

现在,深入研究Fargate,我希望每天执行一次任务。

  • 当我使用ECS的 Scheduled Task 功能时,它似乎工作正常:容器按时启动,进程运行,然后容器停止。但是CloudWatch缺少一些指标:未报告CPUReservation和CPUUtilization。此外,也无法知道批处理是否以退出代码0或1退出(所有执行均以状态“ STOPPED”停止)。因此,如果容器执行失败,我将无法发送CloudWatch警报。

  • 我使用Fargate的“服务”功能,但是它无法处理批处理过程,因为容器每次停止时都会启动。这是正常现象,因为容器没有任何守护程序。无法安排服务。我希望我的容器仅在需要工作时才处于活动状态(每天最多1小时一次)。但是缺少的指标会在CloudWatch中正确报告。

这是我的问题:每天触发一次容器,让其运行以完成其任务并具有报告功能以跟踪执行(CPU使用率,批处理持续时间)(包括警报)的最合适的AWS管理服务是什么? SNS),当任务失败时?

2 个答案:

答案 0 :(得分:0)

我们在确定失败的工作上也遇到了同样的问题。我建议您看一下AWS Batch,其中CloudWatch Logs中提供了FAILED作业的日志。看一下here。 您应该考虑的另一件事是最终选择的任何解决方案的总拥有成本。在这方面,Fargate非常昂贵。

答案 1 :(得分:0)

对于您的项目来说可能为时已晚,但我仍然认为它可以使他人受益。 您是否看过AWS Step Functions?可以定义工作流程并在ECS / Fargate(或在EKS上的工作)上启动任务,等待结果并发出警报/发送电子邮件...