目前我在亚马逊有一台服务器,我把我所有的cronjobs . 我想消除这个单点故障,并将我的所有任务公开为Web服务 . 我想将VPC ELB背后的服务公开给几个将在调用时运行任务的服务器 .
亚马逊(AWS)提供的某些服务是否可以按计划的时间间隔运行重复发生的作业(真正称为Web服务)?我真的希望能够在时间/日规范方面保留cron功能,但是将驱动程序的HA(在正确的时间调用 endpoints 的东西)分配给AWS .
我喜欢SQS如何提供Web endpoints ,但我可以告诉你不能安排它们 . SWF似乎也不合适 .
9 回答
介绍 Events in AWS Cloudwatch
您可以按分钟,每小时,每天或使用控制台和没有Lambda或任何编程使用CRON表达式进行计划 .
我只是使用SNS HTTP endpoints 安排我的ASP.net WEB API(HTTP Post)来执行每一分钟并且它工作正常 .
This a hosted third party site that can regularly call scheduled scripts on your domain.
如果您需要在shell中运行脚本而不是Apache,那么这将不起作用 .
看起来这是来自AWS BeanStalk的相对较新的选项:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks
基本上,它们的行为类似于常规SQS接收器,但它们是在cron调度上调用的,而不是响应SQS消息 .
AWS Elastic Load Balancers将ping您的实例以检查它们是否 Health . 您可以将类似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 job
这是人们(包括我)在使用AWS设计架构时不断提及的几个单点故障之一 . 在亚马逊通过服务解决它之前,我发布了一些被一些公司积极使用的黑客 .
AWS Auto Scaling可以使用以cron格式指定的定期计划来运行和终止实例 .
http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_PutScheduledUpdateGroupAction.html
您可以让实例在启动时自动运行进程 .
如果您不知道作业将持续多长时间,您可以进行设置,以便作业在完成后终止实例 .
这是我写的一篇文章,它介绍了设置它所需的确切命令:
开始一个完整的实例只是为了开始一组工作似乎有点像矫枉过正,但如果它是一个t1.micro,那么它只需花费几美分 .
t1.micro也不必做实际的工作 . 您的实例可以将消息注入SQS或通过SNS,以便其他冗余服务器接收任务 .
听起来像这样对你有用:http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-using-task-runner.html
SWF是AWS的Web服务,可用于计划任务 . 大部分工作都用于指定任务和计划的内容 .
http://milindparikh.blogspot.com/2015/07/introducing-diksha-aws-lambda-function.html是针对SWF编写的可伸缩调度程序 .
AWS announced支持Lambda在2015 re:Invent Session 中的计划功能 . 有了这个功能用户可以使用类似cron的语法按计划执行Lambda函数 . Lambda docs show an example使用Python来执行预定事件 .
目前,计划的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中的资源
希望很快能有更好的解决方案 .
亚马逊去年为NodeJS推出了Lambda,yesterday亚马逊增加了预定功能,VPC支持和Python支持功能 .
通过利用预定功能 - 可以实现CRON的正确替换 .
更多信息 - http://aws.amazon.com/lambda/details/