在没有 cron 的情况下在 AWS 中运行调度任务

目前,我在亚马逊只有一个服务器,我把我所有的骗子。我希望消除这个单点故障,并将所有任务公开为 Web 服务。我想将 VPC ELB 后面的服务公开给几个服务器,这些服务器将在调用时运行这些任务。

Amazon (AWS)是否提供了某种服务,可以按照预定的时间间隔运行重复作业(实际上称为 Web 服务) ?我真的希望能够按照时间/日规范保留 cron 功能,但是将驱动程序的 HA (在正确的时间调用端点的东西)外包给 AWS。

我喜欢 SQS 提供 web 端点的方式,但是我可以告诉你不能安排它们。主权财富基金似乎也不太合适。

54633 次浏览

Amazon (AWS)是否提供了某种服务,可以按照预定的时间间隔运行重复作业?

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

AWS 自动伸缩可以使用 cron 格式中指定的循环调度来运行和终止实例。

Http://docs.amazonwebservices.com/autoscaling/latest/apireference/api_putscheduledupdategroupaction.html

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

如果不知道作业将持续多长时间,可以设置一些东西,以便作业在完成时终止实例。

下面是我写的一篇文章,其中详细介绍了设置这个程序所需的具体命令:

使用自动缩放在循环调度上运行 EC2实例
Http://alestic.com/2011/11/ec2-schedule-instance

开始一个完整的实例只是为了开始一系列的工作看起来有点过分,但是如果它是一个 t1.micro,那么它只需要几个便士。

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

听起来这个可能对你有用: Http://docs.aws.amazon.com/datapipeline/latest/developerguide/dp-using-task-runner.html

TaskRunner 是一个轮询 AWS 数据管道的任务代理应用程序 并在 AmazonEC2实例上执行它们 EMR 集群或其他计算资源报告状态 视乎你的申请,你可选择:

  • 允许 AWS 数据管道安装和管理一个或多个任务运行器 它管理的计算资源上的应用程序 在这种情况下,您不需要安装或配置 任务运行器,如本节所述 配置。

  • 在计算资源上手动安装和配置“任务运行器” 例如长时间运行的 EC2实例或物理服务器, 使用本节中的程序

  • 开发和安装自定义任务代理,而不是“任务运行器” 有关程序将视乎实施 自定义任务代理

AWS 弹性负载均衡器将 ping 您的实例以检查它们是否健康。您可以将类似 cron 的任务添加到 ELB 正在 ping 的脚本中,并且它将非常有规律地执行。

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

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

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

这是一个托管的第三方网站,可以定期调用您的域上预定的脚本。

如果您需要脚本在 shell 中运行,而不是作为 Apache 运行,那么这将无法工作。

在2015年的发明大会上,AWS 宣布对 Lambda 中预定功能的支持。有了这个特性,用户可以使用类似 cron 的语法在计划的基础上执行 Lambda 函数。使用 Python 执行预定事件的 Lambda 文档展示了一个例子

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

兰德项目有助于简化 Lambda 上调度函数的使用。

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


原始答案,留给后人

正如 Eric Hammond 和其他人所说,没有针对预定任务的本地 AWS 服务。正如其他答案中提到的,只有变通方法和一半的解决方案。

回顾一下目前的选择:

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

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

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

基本上,它们的作用类似于常规的 SQS 接收器,但是它们是在 cron 调度上调用的,而不是响应 SQS 消息。

SWF 是来自 AWS 的 Web 服务,可用于调度任务。大多数工作都是指定任务和日程安排。

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

亚马逊去年为 NodeJS 引入了 Lambda,昨天亚马逊增加了调度函数、 VPC 支持和 Python 支持等功能。

通过利用调度功能-一个适当的替代 CRON 可以实现。

更多资讯 -http://aws.amazon.com/lambda/details/

enter image description here

介绍 AWS Cloudwatch 中的事件

您可以按分钟、小时、天或使用 CRON 表达式使用控制台,不需要 Lambda 或任何编程。

我只是安排我的 ASP.net WEB API (HTTP Post)使用 SNS HTTP 端点来执行每一分钟,它工作得很完美。

enter image description here

CloudWatch Events 很棒,但是 他们的数量是有限制的。如果您需要一个规模,并愿意牺牲精度,您可以使用 DynamoDB 的 TTL作为计时器。

其思想是将项目放入 DynamoDB 表中,并将 TTL 设置为运行任务所需的时间。DynamoDB 将在指定时间(过期后48小时内)删除这些项目。这些被删除的项目将出现在 DynamoDB 流中,与一个表相关联。Lambda 函数可以侦听流并对删除操作采取适当的操作。

Theburningmonk.com 阅读更多 DynamoDB TTL 作为即席调度机制

截至2020年8月,Amazon 已经将 Lambda/CloudWatch 事件转移到一个名为 EventBridge(https://aws.amazon.com/eventbridge/)的服务中。2019年7月,在这个问题的大部分答案得到回答之后,它被发布了。