15

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

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

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

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

  • 同样,我不喜欢这种方法,因为它需要 cpu 周期远离 Web 服务器

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

  • 这解决了 Web 服务器资源问题,但为什么要为额外的 EC2 实例付费以运行小于 5 分钟的作业呢?浪费钱!

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

4

7 回答 7

16

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

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

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

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

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

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

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

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

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

于 2012-01-10T23:57:23.107 回答
9

Amazon 刚刚发布了[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 -角色创建/

于 2015-02-24T10:54:56.333 回答
2

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

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

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

于 2013-01-27T22:22:01.460 回答
2

AWS 数据管道

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

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

{
 "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" }
      ]
    }
  ]
}

限制:最小调度间隔为 15 分钟。
定价:每月约 1.00 美元。

于 2015-08-21T14:22:33.787 回答
1

您应该考虑 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/

于 2017-09-25T14:22:01.960 回答
0

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

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

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

于 2012-01-10T23:28:02.000 回答
0

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

于 2014-02-26T16:52:30.070 回答