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

时间:2012-07-23 16:02:22

标签: amazon-web-services cron

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

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

我喜欢SQS如何提供网络端点,但我可以告诉你不能安排它们。 SWF似乎也不合适。

11 个答案:

答案 0 :(得分:63)

AWS announced支持Lambda在2015 re:Invent大会上的预定功能。使用此功能,用户可以使用类似cron的语法按计划执行Lambda函数。使用Python执行预定事件的Lambda docs show an example

目前,预定lambda可以运行的最小分辨率是1分钟(与cron相同,但不像systemd计时器那样精细)。

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

λ Gordon's cron example可能是部署预定lambda函数的最简单的接口。


原始答案,为后代保存。

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

重温当前选项:

  • 按照计划开始和停止的单实例自动缩放组,如Eric Hammond所述。
  • Using a Simple Workflow Service timer,这一点都不直观。这个case study提到JPL使用SWF来构建分布式cron,但是没有实现细节。还有对{SWF代码示例中隐藏的code example的引用。
  • 使用类似cronlock的内容自行运行。
  • 使用类似Unreliable Town Clock (UTC)的内容按计划运行Lambda函数。请记住,Lambda当前无法访问VPC中的资源

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

答案 1 :(得分:11)

介绍 Events in AWS Cloudwatch

您可以按分钟,每小时,每天或使用控制台和没有Lambda或任何编程使用CRON表达式进行安排。

我只是使用SNS HTTP端点安排我的ASP.net WEB API(HTTP Post)每分钟执行一次,并且它完美运行。

enter image description here

答案 2 :(得分: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,以便其他冗余服务器接收任务。

答案 3 :(得分:4)

This a hosted third party site that can regularly call scheduled scripts on your domain.

如果您需要在shell中运行脚本而不是Apache,那么这将不起作用。

答案 4 :(得分: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实例或物理服务器。为此,   使用本节中的步骤。

  •   
  • 开发并安装自定义任务代理而不是任务运行器。该   这样做的程序将取决于实施   自定义任务代理。

  •   

答案 5 :(得分:3)

亚马逊去年为NodeJS推出了Lambda,yesterday亚马逊增加了预定功能,VPC支持和Python支持功能。

通过利用预定功能 - 可以实现CRON的正确替换。

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

{{0}}

答案 6 :(得分:1)

看起来这是来自AWS BeanStalk的相对较新的选项:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks

基本上,它们就像常规的SQS接收器一样,但它们是在cron调度上调用的,而不是响应SQS消息。

答案 7 :(得分:0)

SWF是来自AWS的Web服务,可用于安排任务。大部分工作都用于指定任务和时间表。

http://milindparikh.blogspot.com/2015/07/introducing-diksha-aws-lambda-function.html是针对SWF编写的可伸缩调度程序。

答案 8 :(得分:0)

CloudWatch Events很棒,但是there is a limit on their number。如果您需要刻度并且愿意牺牲精度,可以使用DynamoDB's TTL作为计时器。

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

在theburningmonk.com的“ DynamoDB TTL as an ad-hoc scheduling mechanism”中了解更多信息。

答案 9 :(得分:0)

截至2020年8月,亚马逊已将Lambda / CloudWatch事件移至名为 EventBridge https://aws.amazon.com/eventbridge/)的服务。经过对该问题的大部分回答后,它于2019年7月启动。

答案 10 :(得分:-2)

AWS Elastic Load Balancers将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调用实际上处理了cron作业