在没有cron的情况下在AWS中运行计划的任务


72

目前,我在亚马逊中有一台服务器,我将所有cronjobs都放在其中。我想消除这一单点故障,并将所有任务公开为Web服务。我想将VPC ELB背后的服务提供给一些服务器,这些服务器将在调用时运行任务。

Amazon(AWS)是否提供一些可以按计划的间隔运行重复发生的工作(真正称为Web服务)的服务?我真的很想能够在时间/日期规范方面保留cron功能,但是将驱动程序的HA(在正确的时间调用端点的东西)分配给AWS。

我喜欢SQS如何提供Web端点,但是据我所知,您无法安排它们。SWF似乎也不适合。


Answers:


68

AWS在其2015 re:Invent会议上宣布了对Lambda中计划功能的支持。使用此功能,用户可以使用类似cron的语法按计划执行Lambda函数。该LAMBDA文档显示的示例使用Python来执行预定的事件。

当前,计划的lambda可以运行的最低分辨率为1分钟(与cron相同,但不如systemd计时器细粒度)。

Lambder项目有助于简化LAMBDA上使用的预定功能。

λGordon的cron示例可能具有部署调度的lambda函数的最简单接口。


原始答案,为后代保存。

正如Eric Hammond和其他人所说,没有用于计划任务的本机AWS服务。如其他答案中所述,只有解决方法和一半解决方案。

回顾一下当前选项:

希望很快会有更好的解决方案。


好,谢谢您提供更新的详细信息。希望亚马逊正在开发一项新服务,将来可以解决此问题。
thatidiotguy 2015年

2
@thatidiotguy,以防万一您没有看到该公告,AWS Lambda现在解决了这一差距。答案已相应更新。
Ben Whaley 2015年

2
Lambda不必执行此工作,如果您使用Lambda创建可以触发其中一台服务器上的作业的SQS,则可以解决无法在VPC中运行Lambda的问题。
ThomasRedstone

16

在AWS Cloudwatch中介绍事件

您可以按分钟,小时,天或使用控制台使用CRON表达式进行计划,而无需Lambda或任何编程。

我刚刚使用SNS HTTP端点计划了我的ASP.net WEB API(HTTP帖子)每分钟执行一次,并且运行良好。

在此处输入图片说明


调用Lambda函数似乎很棒。
Athar

我设计了一个在单实例Beanstalk上由Scheduler调用的方法。到了迁移到ELB的时候,我必须找到一种方法来使调度程序仅调用一个方法。我认为这将起作用:触发SNS的Cron作业到达一个端点,该端点调用了计划程序曾经调用的方法!
payne

7

亚马逊(AWS)提供了一些可以按计划的间隔运行重复性工作的服务吗?

这是人们(包括我)在使用AWS设计架构时经常提到的几个单点故障之一。在亚马逊通过服务解决该问题之前,这是我发布的一种黑客,一些公司正在积极使用。

AWS Auto Scaling可以使用cron格式指定的定期计划运行和终止实例。

http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_PutScheduledUpdateGroupAction.html

您可以让实例在启动时自动运行进程。

如果您不知道工作将持续多长时间,则可以进行设置,以使工作在实例完成时终止。

这是我写的一篇文章,其中详细介绍了设置此命令所需的命令:

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

开始一个完整的实例只是为了开始一系列工作,似乎有点过头了,但是如果它是t1.micro,那么它只需花费几美分。

t1.micro也不用做实际的工作。您的实例可以将消息注入SQS或通过SNS,以便其他冗余服务器接收任务。


这将适用于一个cron。但是,当您有多个这样的作业以不同的间隔运行时,则会增加复杂性和成本。
Wasif

是的,我同意埃里克。这是我在AWS中遇到的最常见的问题之一,它们具有许多良好的服务,但这是AWS真正缺乏的一件事。这并不是说其他​​任何云提供商都提供了更好的选择。
bwight

是的,我曾想过做类似的事情,但它没有我需要/想要的强大。很好奇,您是AWS高级用户愿意为解决此问题的软件即服务付费吗?我知道我可以做一些具有一些特定于aws集成的事情,只是想知道是否值得在时间/美元上进行投资。我当时认为定价/公交车模型将遵循pingdom.com
rynop 2012年

@mwasif:如果您每天要运行20个cron作业,则可以将它们堆叠在一个预定的事件中,以便一个实例触发所有这些作业。如果您有许多不同的时间表,那么仅运行一个全时实例可能会更便宜。您可以使用Auto Scaling来确保实例发生故障时将其替换。
埃里克·哈蒙德

@rynop:这种方法不能满足您的需求吗?
埃里克·哈蒙德


3

这样的声音可能对您有用:http : //docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-using-task-runner.html

Task Runner是一个任务代理应用程序,可轮询AWS Data Pipeline中的计划任务并在Amazon EC2实例,Amazon EMR集群或其他计算资源上执行它们,并报告状态。根据您的应用程序,您可以选择:

  • 允许AWS Data Pipeline在自动管理的计算资源上为您安装和管理一个或多个Task Runner应用程序。在这种情况下,您无需按照本节中的说明安装或配置Task Runner。这是推荐的配置。

  • 在诸如长期运行的EC2实例或物理服务器之类的计算资源上手动安装和配置Task Runner。为此,请使用本节中的步骤。

  • 开发并安装自定义任务代理,而不是Task Runner。这样做的过程将取决于自定义任务代理的实现。


取消标记为正确。在终于花时间真正地研究了这个问题之后,数据管道似乎并不能解决我的特定问题。它对于设置不可更改的计划非常有用。任务,例如每天备份发电机表。国际海事组织认为,一个需要大量(数千个)不同工作(称为活动)的系统必须在不同时间以不同的“参数”运行。
rynop 2014年

3

亚马逊去年为NodeJS引入了Lambda,昨天亚马逊又添加了计划功能,VPC支持和Python支持功能。

通过利用预定功能-可以适当替代CRON。

更多信息-http: //aws.amazon.com/lambda/details/

在此处输入图片说明


谢谢您,使用计划功能有什么缺点吗?
Goke Obasa

预定功能 @AdegokeObasa您能否详细说明预定功能是什么意思?
Naveen Vijay

抱歉,我的意思是预定活动
Goke Obasa

尚不清楚:)您是否提到CloudWatch Events?
Naveen Vijay

是的,我是在问,使用Cloudwatch Scheduled Events是否有不利之处。对不起,我还不够清楚。
Goke Obasa



0

CloudWatch Events很棒,但是数量有限。如果需要缩放比例并愿意牺牲精度,则可以使用DynamoDB的TTL作为计时器。

想法是将项目放入TTL设置为运行任务所需时间的DynamoDB表中。DynamoDB将在指定时间(有效期48小时内)左右的某个位置删除这些项目。这些已删除的项目将出现在与表关联的DynamoDB流中。Lambda函数可以侦听流并在删除后采取适当的措施。

theburningmonk.com的DynamoDB TTL作为即席调度机制”中了解更多信息。



-2

AWS Elastic Load Balancer将对您的实例执行ping操作,以检查它们是否正常。您可以将类似于cron的任务添加到ELB ping的脚本中,它将非常定期地执行。

您需要添加一些逻辑,以使每个任务在正确的时间量和正确的间隔执行,但这可以通过跟踪执行的数据库表来完成。每次ELB对服务器执行ping操作时,服务器都会检查数据库以查看是否有任何作业挂起,然后执行该作业。

如果脚本执行时间太长,ELB将会超时,因此不要造成ELB运行状况检查将花费很多秒来处理cron任务的情况,这一点很重要。为了解决这个问题,您可以使用AWS Simple Notification Service。您的ELB健康检查脚本可以简单地将消息发布到SNS主题,然后该主题可以通过HTTP请求将消息传递到Web服务器。

换句话说:ELB ping您的EC2实例... EC2实例检查挂起的作业,如果找到任何消息,则向SNS发送消息... SNS通过HTTP通知您的应用...来自SNS的HTTP调用实际上是处理计划工作


5
仅在计算机上设置Cron,Chronos或Quartz会更简单。
eSniff 2014年

1
是的,很好。ELB或cron是否定期点火无关紧要。你是对的。我的答案太复杂了。:-)
特拉维斯·奥斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.