Amazon ec2 在AWS EC2上安排作业

Amazon ec2 在AWS EC2上安排作业,amazon-ec2,amazon-web-services,cron,jobs,elastic-map-reduce,Amazon Ec2,Amazon Web Services,Cron,Jobs,Elastic Map Reduce,我有一个在AWS EC2上运行的网站。我需要创建一个夜间作业,生成一个站点地图文件并将文件上传到各种浏览器。我正在AWS上寻找一个允许此功能的实用程序。我考虑了以下几点: 1) 向web服务器生成一个请求,触发它执行此任务 我不喜欢这种方法,因为它会占用服务器线程,并在主机上使用cpu周期 2) 在运行web服务器的计算机上创建cron作业以执行此任务 同样,我不喜欢这种方法,因为它会占用web服务器的cpu周期 3) 创建另一个EC2实例并设置一个cron作业来运行该任务 这就解决了

我有一个在AWS EC2上运行的网站。我需要创建一个夜间作业,生成一个站点地图文件并将文件上传到各种浏览器。我正在AWS上寻找一个允许此功能的实用程序。我考虑了以下几点:

1) 向web服务器生成一个请求,触发它执行此任务

  • 我不喜欢这种方法,因为它会占用服务器线程,并在主机上使用cpu周期
2) 在运行web服务器的计算机上创建cron作业以执行此任务

  • 同样,我不喜欢这种方法,因为它会占用web服务器的cpu周期
3) 创建另一个EC2实例并设置一个cron作业来运行该任务


  • 这就解决了web服务器资源问题,但是为什么还要为额外的EC2实例付费来运行作业呢如果这项任务可以用一台机器完成,我建议使用ruby编写的脚本以编程方式启动实例

    启动实例后,可以通过ssh运行命令。完成后,您也可以使用fog关机


    如果您的任务可以以map-reduce的方式编写,那么amazonemr也是一个很好的解决方案。EMR将负责启动/停止实例。可以帮助您自动化它

    如果我处于您的位置,我可能会尝试在低潮时每晚在web服务器上运行cron作业,并监控资源使用情况,以确保它不会干扰web服务器

    如果您发现它不能很好地发挥作用,或者您对您的架构的优雅有很高的标准(我很欣赏),那么您可能需要运行一个单独的实例

    我同意,一天24小时运行一个实例对于一个每晚只需要运行一次的作业来说是一种浪费

    这里有一个问题:主计算机(当前为web服务器)上的cron作业可能会启动一个新实例来运行该任务。它可以传入一个在实例启动时运行的用户数据脚本,并且实例可以在完成任务时自行关闭(其中实例启动的关闭行为设置为“终止”)

    不幸的是,这没有实现您强制分离关注点的愿望,当您开始扩展到多个web服务器时,它会变得复杂,并且需要您的web服务器处于活动状态才能运行作业

    几个月前,我提出了一种不同的方法来按照cron时间表运行实例,完全依赖于现有的AWS特性,不需要运行其他服务器

    其基本思想是使用Amazon的自动缩放功能,在每晚的特定时间将组从“0”缩放到“1”。实例可以在作业完成时自行终止,并且自动缩放可以在很久之后进行清理,以确保其终止

    我在本文中提供了更多细节和一个工作示例:

    在具有自动缩放功能的定期计划上运行EC2实例


    假设您运行的是*nix版本的EC2,我建议您使用nice命令在cron中运行它

    nice更改作业的优先级。您可以将其设置为低得多的优先级,因此如果您的Web服务器正忙,cron作业将不得不等待CPU

    尼斯数字越高,优先级越低。
    精确度范围从-20(最有利的调度)到19(最不利)。

    您可以使用AWS Opswork为应用程序设置cron作业。有关更多信息,请阅读AWS OpsWork上的用户指南。我发现一个页面解释了如何设置cron作业:

    亚马逊刚刚发布了[1]Elastic Beanstalk的新功能。现在,您可以创建一个包含cron.yaml的工作环境,该工作环境使用cron语法配置调用URL的调度任务:

    [1]

    AWS数据管道 您可以使用AWS数据管道来完成具有给定周期的任务。当您使用配置管道时,该操作可以是任何命令

    甚至可以使用现有EC2实例在EC2实例上运行命令:Setup,并在数据管道上设置ShellCommandActivity()时设置
    workerGroup
    字段:

    {
    “pipelineId”:“df-0937003356ZJEXAMPLE”,
    “pipelineObjects”:[
    {
    “id”:“时间表”,
    “名称”:“附表”,
    “字段”:[
    {“key”:“startDateTime”,“stringValue”:“2012-12-12T00:00:00”},
    {“key”:“type”,“stringValue”:“Schedule”},
    {“key”:“period”,“stringValue”:“1小时”},
    {“key”:“endDateTime”,“stringValue”:“2012-12-21T18:00:00”}
    ]
    }, {
    “id”:“DoSomething”,
    “名称”:“DoSomething”,
    “字段”:[
    {“键”:“类型”、“字符串值”:“ShellCommandActivity”},
    {“key”:“command”,“stringValue”:“echo hello”},
    {“key”:“schedule”,“refValue”:“schedule”},
    {“key”:“workerGroup”,“stringValue”:“yourWorkerGroup”}
    ]
    }
    ]
    }
    

    :最小调度间隔为15分钟。
    每月约1美元。

    你应该考虑CuldWAT事件和LAMBDA()。您只需为实际跑步付费。我假设弹性豆茎维持的工人即使闲置也要花一些钱


    更新:发现这篇漂亮的文章()

    它看起来像是你的应用程序的功能,而不是服务器解决方案,这就是为什么我排除了第1项和第2项我想我应该提到我的应用程序是用Java编写的?这是运行Rails的人可以接受的解决方案,但不适用于其他语言。嗯,这看起来像是为了一个简单的工作而跳出很多圈圈。在我看来,亚马逊并没有满足这样一个需求:一个类似cron的服务,在任何机器上运行任意命令行作业。他们可以根据使用的CPU+内存资源进行充电。谢谢你的回答。谢谢你非常有用的编辑。这似乎是一个相当不错的方法。我仍然有点困惑,为什么AWS没有支持的东西