繁体   English   中英

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

[英]run scheduled task in AWS without cron

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

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

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

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

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

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

λ Gordon 的 cron 示例可能具有用于部署计划的 lambda 函数的最简单的接口。


原始答案,为后代保存。

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

回顾一下当前的选项:

  • 如 Eric Hammond 所述,按计划启动和停止的单实例自动缩放组。
  • 使用 Simple Workflow Service timer ,这一点都不直观。 案例研究提到 JPL 使用 SWF 构建分布式 cron,但没有实现细节。 还有一个对隐藏在 SWF 代码示例中的代码示例的引用。
  • 使用诸如cronlock之类的东西自己运行它。
  • 使用诸如不可靠城市时钟 (UTC)之类的东西按计划运行 Lambda 函数。 请记住,Lambda 目前无法访问 VPC 内的资源

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

在 AWS Cloudwatch 中引入事件

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

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

在此处输入图像描述

Amazon (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,以便其他冗余服务器接管任务。

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

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

听起来这可能对您有用: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。 这样做的过程将取决于自定义任务代理的实现。

Amazon 去年为 NodeJS 引入了 Lambda, 昨天Amazon 添加了 Scheduled Functions、VPC Support 和 Python Support 等功能。

通过利用 Scheduled Function - 可以实现 CRON 的适当替代。

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

在此处输入图像描述

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

看起来这是 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 编写的可扩展调度程序。

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

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

在 theburningmonk.com 的“ DynamoDB TTL 作为临时调度机制”中阅读更多内容。

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 调用是实际处理定时作业

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM