Amazon web services 计划AWS Lambda任务,频率小于1分钟

Amazon web services 计划AWS Lambda任务,频率小于1分钟,amazon-web-services,amazon-ec2,scheduled-tasks,aws-lambda,Amazon Web Services,Amazon Ec2,Scheduled Tasks,Aws Lambda,我们正在尝试开发一个真正的基于lambda的应用程序,其中某些任务需要以可变频率的时间表执行。他们实际上是在轮询数据,在一天中的某些时间,这种轮询可能慢到每小时一次,而在其他时间,它必须每秒一次。我已经研究了调度的选项(例如和),但似乎除了启动EC2实例或长时间运行的lambda之外,没有内置的方法以少于一分钟的频率启动lambda。lambda速率表达式在秒内没有位置。在没有EC2实例或长时间运行的lambda的情况下,有没有办法做到这一点?理想情况下,可以在不产生额外调度成本的情况下完成的操

我们正在尝试开发一个真正的基于lambda的应用程序,其中某些任务需要以可变频率的时间表执行。他们实际上是在轮询数据,在一天中的某些时间,这种轮询可能慢到每小时一次,而在其他时间,它必须每秒一次。我已经研究了调度的选项(例如和),但似乎除了启动EC2实例或长时间运行的lambda之外,没有内置的方法以少于一分钟的频率启动lambda。lambda速率表达式在秒内没有位置。在没有EC2实例或长时间运行的lambda的情况下,有没有办法做到这一点?理想情况下,可以在不产生额外调度成本的情况下完成的操作。

此时,AWS Lambda允许将函数调度为每5分钟运行一次,最大执行时间为5分钟

这意味着,如果您希望在不使用EC2的情况下以少于每5分钟一次的间隔运行AWS Lambda函数,您可以采取两阶段的方法。创建一个AWS Lambda函数,每5分钟运行一次,并在整个5分钟内以适当的时间间隔异步调用其他AWS Lambda函数

由于第一个运行了整整5分钟的AWS Lambda函数基本上是连续运行的,因此这种方法将花费您更多的成本,但是您可以通过分配最小数量的RAM来降低成本


更新


CloudWatch事件现在允许以1分钟的频率安排日程。这意味着您现在可以将Lambda函数安排为每分钟运行一次,并使其最多运行一分钟以实现亚分钟精度。需要注意的是,计划的事件不会在每分钟开始时触发,因此实现精确的分分钟计时仍然有点棘手。

不要使用lambda轮询,或者如果您希望花费更多的时间轮询而不是执行工作,则最好使用EC2。Lambda按执行时间收费,轮询成本高昂


您确实需要一个带有Lambda的事件驱动系统。什么决定您何时轮询?

当前,至少每1分钟从Cloudwatch调度事件调用一次lambda函数

可能有效的解决方案如下:

设置一个EC2实例,并从一个将作为后台作业运行的程序中,使用aws sdk调用lambda函数。例如:

while True:
  invoke lambda function via aws sdk
  sleep for x seconds
理论上,您可以在不使用EC2实例或长时间运行的lambda的情况下,使用由CloudWatch事件调度事件执行的事件(请参见Emanuele Menga的示例)连接高频任务触发器,但根据我目前(截至2019年5月)的估计,这种方法实际上比其他两种方法更昂贵:

(假设1年=31536000秒)

步骤功能:
  • 每1000个状态转换
  • 每勾选2次状态转换(
    等待
    任务
    )+至少每分钟1次(用于设置/配置)
  • 31536000*(2+1/60)*0.0250/1000
    =$1589.94/年,或低至$65.70/年,用于低频触发(每分钟2次)
Lambda函数:
  • 每100ms(最小128mb功能)
  • 31536000*0.000000208*10
    =65.595488美元/年
EC2实例:
  • t3a.nano
    按需每小时收费,或与使用Spot实例时一样低
  • 31536000*0.0047/3600=$41.172/年,或使用Spot实例$12.264/年

因此,会有一些调度成本,但正如您所看到的,成本并不高。

为什么不使用一些小型EC2实例来执行频繁的任务呢?这可能会更有利。@VladimirMukhin谢谢你的建议,我实际上在想也许有一些免费的东西:)。我有你和Jared Hatfields在答案中的替代方法。我已经添加了一些链接到我在这里发布之前搜索答案的地方,如果删除否决票,我将不胜感激。你可能想看看这里的答案:为什么不简单地创建两个事件调度程序?其中两个每分钟执行一次,因此从第一个事件开始时间起半分钟后开始第二个事件。谢谢。要么是这个,要么是最便宜的EC2。需要找出更便宜的方法。应该注意的是,在执行历史日志中输入25k个条目后,step函数将自动停止(失败状态)。对于具有许多状态的阶跃函数,这可能会很快发生。我假设在aws中,你要为lambda睡眠的每一秒付费,因为它算作执行时间?