【问题标题】:Scheduling A Job on AWS EC2在 AWS EC2 上调度作业
【发布时间】:2023-04-06 00:01:02
【问题描述】:

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

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

  • 我不喜欢这种方法,因为它占用了一个服务器线程并使用主机上的 cpu 周期

2) 在运行 Web 服务器的机器上创建一个 cron 作业以执行此任务

  • 再说一次,我不喜欢这种方法,因为它会占用网络服务器的 CPU 周期

3) 创建另一个 EC2 实例并设置一个 cron 作业来运行任务

  • 这解决了 Web 服务器资源问题,但为什么要支付额外的 EC2 实例来运行作业

还有其他选择吗?这是 ElasticMapReduce 的工作吗?

【问题讨论】:

  • 它看起来像你的应用程序的功能,而不是服务器解决方案
  • 对,这就是我排除第 1 项和第 2 项的原因

标签: amazon-ec2 amazon-web-services cron jobs elastic-map-reduce


【解决方案1】:

如果我站在你的立场上,我可能会开始尝试在每晚退潮时在 Web 服务器上运行 cron 作业并监控资源使用情况,以确保它不会干扰 Web 服务器。

如果您发现它运行得不好,或者您对架构的优雅有很高的标准(我很佩服),那么您可能需要运行一个单独的实例。

我同意一天 24 小时运行一个实例来完成你只需要每晚运行一次的工作似乎是一种浪费。

这是一种方法:您的主机(当前是一个 Web 服务器)上的 cron 作业可以启动一个新实例来运行该任务。它可以传入一个用户数据脚本,该脚本在实例启动时运行,并且实例可以在完成任务时自行关闭(其中 instance-initiated-shutdown-behavior 设置为“terminate”)。

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

几个月前,我想出了一种不同的方法来按 cron 计划运行实例,完全依赖现有的 AWS 功能,并且不需要运行其他服务器。

其基本理念是使用 Amazon 的 Auto Scaling 并通过重复操作在每晚的特定时间将组从“0”扩展到“1”。实例可以在作业完成后自行终止,Auto Scaling 可以在很久以后进行清理以确保它已终止。

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

使用 Auto Scaling 定期运行 EC2 实例
http://alestic.com/2011/11/ec2-schedule-instance

【讨论】:

  • 好吧,这似乎是为了完成一项简单的工作。在我看来,亚马逊没有解决一种需求:一种类似 cron 的服务,可以在任何机器上运行任意命令行作业。他们可以根据使用的 CPU + 内存资源收费。感谢您的回答。
  • 感谢您的非常有帮助的编辑。这似乎是一个相当不错的方法。对于为什么 AWS 没有东西来支持开箱即用的一次性工作,我仍然有些困惑。我正在想象一个界面,我可以在其中识别要按设定的时间表运行的自定义程序/脚本。看起来很基础!
  • +1 表示“亚马逊应该支持这种开箱即用的基本操作”
  • AWS Lambda 在其路线图上有此功能 - stackoverflow.com/questions/27382009/aws-lambda-scheduled-tasks
【解决方案2】:

亚马逊刚刚发布了[1] Elastic Beanstalk 的新功能。您现在可以创建一个包含 cron.yaml 的工作环境,该环境配置调用具有 CRON 语法的 URL 的调度任务:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks

[1]http://aws.amazon.com/about-aws/whats-new/2015/02/17/aws-elastic-beanstalk-supports-environment-cloning-periodic-tasks-and-1-click-iam-role-creation/

【讨论】:

  • 我终于可以选择一个正确的答案了!其他答案都很好并且可以工作,但我真的在寻找 AWS 的服务来解决这个问题。
【解决方案3】:

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

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

nice 数字越大,优先级越低。 Nicenesses 范围从 -20(最有利的调度)到 19(最不利的调度)。

【讨论】:

    【解决方案4】:

    AWS 数据管道

    您可以使用 AWS Data Pipeline 来schedule 具有给定时间段的任务。当您使用ShellCommandActivity 配置管道时,该操作可以是任何命令。

    您甚至可以使用现有的 EC2 实例运行命令:在您的 EC2 实例上设置 Task Runner,并在您的 DataPipeline 上设置 ShellCommandActivity (doc) 时设置 workerGroup 字段:

    {
     "pipelineId": "df-0937003356ZJEXAMPLE",
     "pipelineObjects": [
        {
          "id": "Schedule",
          "name": "Schedule",
          "fields": [
            { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
            { "key": "type", "stringValue": "Schedule" }, 
            { "key": "period", "stringValue": "1 hour" }, 
            { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
           ]
         }, {
          "id": "DoSomething",
          "name": "DoSomething",
          "fields": [
            { "key": "type", "stringValue": "ShellCommandActivity" },
            { "key": "command", "stringValue": "echo hello" },
            { "key": "schedule", "refValue": "Schedule" },
            { "key": "workerGroup", "stringValue": "yourWorkerGroup" }
          ]
        }
      ]
    }
    

    Limits:最小调度间隔为 15 分钟。
    Pricing:大约每月 1.00 美元。

    【讨论】:

      【解决方案5】:

      您应该考虑使用 CloudWatch Event 和 Lambda (http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html)。您只需为实际运行付费。我假设 Elastic beanstalk 维护的工人即使在闲置时仍然需要一些钱。

      更新:发现这篇不错的文章 (http://brianstempin.com/2016/02/29/replacing-the-cron-in-aws/)

      【讨论】:

        【解决方案6】:

        如果此任务可以在一台机器上完成,我建议使用用 ruby​​ 编写的 fog gem 以编程方式启动一个实例。

        启动实例后,您可以通过 ssh 运行命令。完成后,您也可以关闭雾气。

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

        【讨论】:

        • 我想我应该提到我的应用程序是用 Java 编写的?
        • 对于那些运行 Rails 的人来说,这是一个可以接受的解决方案,但对于其他语言来说却不是。
        【解决方案7】:

        您可以使用 AWS Opswork 为您的应用程序设置 cron 作业。有关更多信息,请阅读他们关于 AWS OpsWork 的用户指南。我找到了一个解释如何设置 cron 作业的页面:http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-14
          • 2022-01-04
          • 1970-01-01
          • 2017-03-22
          • 1970-01-01
          • 1970-01-01
          • 2019-03-09
          相关资源
          最近更新 更多