我在AWS EC2上运行了一个网站。我需要创建一个夜间作业,生成站点地图文件并将文件上传到各种浏览器。我在AWS上寻找一个允许此功能的实用程序。我考虑过以下几点:
1)向Web服务器生成一个请求,以触发它执行此任务
2)在运行Web服务器的计算机上创建一个cron作业以执行此任务
3)创建另一个EC2实例并设置一个cron作业来运行任务
还有其他选择吗?这是ElasticMapReduce的工作吗?
答案 0 :(得分:16)
如果我在你的位置,我可能会首先尝试在退潮时每天晚上在网络服务器上运行cron作业并监控资源使用情况,以确保它不会干扰网络服务器。 / p>
如果你发现它不能很好地运行,或者你对你的架构的优雅有很高的标准(我可以欣赏它),那么你可能需要运行一个单独的实例。
我同意,每天24小时运行一个实例似乎是浪费,只需要每晚运行一次。
这是一个方法:主计算机上的cron作业(当前是Web服务器)可以启动一个新实例来运行任务。它可以传入在实例启动时运行的用户数据脚本,并且实例可以在完成任务时将自身关闭(其中instance-initiated-shutdown-behavior设置为“terminate”)。
不幸的是,这忽略了您强制执行问题分离的愿望,当您开始扩展到多个Web服务器时它变得复杂,并且它需要您的Web服务器处于活动状态才能运行作业。
几个月前,我提出了一种不同的方法来运行cron计划中的实例,完全依赖于现有的AWS功能,并且不需要运行其他服务器。
基本思想是使用亚马逊的Auto Scaling,并在每晚的特定时间将群组从“0”缩放到“1”。作业完成后,实例可以自行终止,Auto Scaling可以稍后清理以确保它已终止。
我在本文中提供了更多详细信息和工作示例:
使用Auto Scaling在循环计划上运行EC2实例
http://alestic.com/2011/11/ec2-schedule-instance
答案 1 :(得分:9)
亚马逊刚刚发布了[1] Elastic Beanstalk的新功能。您现在可以创建一个包含cron.yaml的工作线程环境,该环境配置使用CRON语法调用URL的调度任务:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks
答案 2 :(得分:2)
假设您在EC2的* nix版本上运行,我建议您使用nice命令在cron中运行它。
nice 更改作业的优先级。您可以将其设置为低优先级,因此如果您的Web服务器繁忙,则cron作业必须等待CPU。
好的数字越高,优先级越低。 不错的范围从-20(最有利的调度)到19(最不利的)。
答案 3 :(得分:2)
您可以将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" }
]
}
]
}
答案 4 :(得分: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/)
答案 5 :(得分:0)
如果可以使用一台计算机完成此任务,我建议使用ruby中编写的fog gem以编程方式启动实例。
启动实例后,可以通过ssh运行命令。完成后,您也可以关闭雾。
如果您的任务可以以地图缩减方式编写,那么Amazon EMR也是一个很好的解决方案。 EMR将负责启动/停止实例。 elastic-mapreduce-ruby cli tool可以帮助您实现自动化
答案 6 :(得分:0)
您可以使用AWS Opswork为您的应用程序设置cron作业。有关更多信息,请阅读AWS OpsWork上的用户指南。我找到了一个解释如何设置cron作业的页面:http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html