74

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

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

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

4

11 回答 11

70

AWS在 2015 年 re:Invent 大会上宣布支持 Lambda 中的预定函数。借助此功能,用户可以使用类似 cron 的语法按计划执行 Lambda 函数。Lambda 文档展示了一个使用 Python 执行计划事件的示例。

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

Lambder项目有助于简化 Lambda 上计划函数的使用

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


原始答案,为后代保存。

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

回顾一下当前的选项:

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

于 2015-01-17T23:59:25.063 回答
16

介绍AWS Cloudwatch 中的事件

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

我刚刚使用 SNS HTTP 端点安排我的 ASP.net WEB API(HTTP Post)每分钟执行一次,它运行良好。

在此处输入图像描述

于 2016-05-12T15:19:37.807 回答
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,以便其他冗余服务器接收任务。

于 2012-07-23T18:52:34.287 回答
4

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

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

于 2013-08-15T22:01:34.043 回答
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。这样做的过程将取决于自定义任务代理的实现。

于 2013-08-12T14:10:56.017 回答
3

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

通过利用计划功能 - 可以实现 CRON 的适当替代。

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

在此处输入图像描述

于 2015-10-09T14:14:15.903 回答
3

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

于 2020-08-23T09:02:28.687 回答
1

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

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

基本上,它们的行为类似于常规的 SQS 接收器,但它们是按 cron 计划调用的,而不是响应 SQS 消息。

于 2015-06-25T15:57:34.130 回答
0

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

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

于 2015-08-14T21:49:45.320 回答
0

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

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

阅读 theburningmonk.com 的“ DynamoDB TTL 作为一种临时调度机制”中的更多信息。

于 2020-03-20T10:02:54.510 回答
-2

AWS 弹性负载均衡器将 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 调用实际处理定时任务

于 2013-08-14T03:53:41.440 回答