AWS Fargate 与 Batch 与 ECS 进行一天一次的批处理

Jay*_*ore 8 amazon-ecs aws-fargate

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

我想知道用于调度、执行和监控我的批处理的最佳 AWS 服务是什么:

  • 一开始,我使用了带有 crontabEC2 机器:这里没有高可用性功能,所以我决定切换到更多 PaaS 的方法。
  • 然后,我将Elastic Beanstalk 用于 Docker,带有一个非功能性 Web 服务器(仅用于回复 Healthcheck)和容器内的 Crontab,每天唤醒一次我的批处理命令。使用自动调用规则 min=1 max=1,我有 HA(如果容器崩溃或 VM 崩溃,它会被 AWS 重新启动)
  • 但是现在,为了提高效率,我决定转向某些ECS 服务,并采用一种方法,我不需要让 EC2 实例 23/24 无所事事地唤醒。所以我尝试了 Fargate。
  • 使用Fargate我定义了我的任务(Fargate 类型,而不是 EC2 类型),并在其上配置所有内容。
  • 我创建了一个集群来运行我的任务:我可以“手动一次”运行我的任务,所以我知道每个设置都是正确的。

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

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

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

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

小智 2

我们在识别失败的作业时也遇到了同样的问题。我建议您查看一下 AWS Batch,其中 CloudWatch Logs 中提供了失败作业的日志;看看这里。您还应该考虑的另一件事是您最终选择的任何解决方案的总拥有成本。从这方面来看,Fargate 相当昂贵。