AWS Lambda计划任务


145

亚马逊宣布推出AWS Lambda(http://aws.amazon.com/lambda/)。

产品说明包括:

计划任务

AWS Lambda函数可以由外部事件计时器触发,因此可以在定期安排的维护时间或非高峰时间运行这些函数。例如,您可以触发AWS Lambda函数以在非繁忙时间执行每晚的存档清理。

当我阅读此书时,我了解到我终于可以有一种方法来始终如一地完成“类似cron的任务”。我想每天下午5点运行一个特定的查询。

但是,我在文档的任何地方都找不到。他们仅提及程序事件或其他AWS服务事件的触发器。

我误会了吗 还是有人可以指出我的文档?

Answers:


159

2015年10月8日增加了对计划活​​动的本机支持:

正如该AWS博客文章中所宣布的那样,现在支持将调度作为一种称为“ CloudWatch Events-Schedule ” 的事件源类型(也称为触发器),并且可以将其表示为比率或cron表达式。

将预定事件添加到新的lambda

导航到创建的“配置触发器”步骤,然后指定“ CloudWatch Event-Schedule”触发器。下面的示例配置:

该图显示了在UTC下午5点创建预定事件的配置。

将预定事件添加到现有lambda

导航到lambda的“触发器”选项卡,选择“添加触发器”,然后指定“ CloudWatch Event-Schedule”触发器。屏幕快照示例,其中有一个带有SNS触发器的现有lambda:

该图显示了如何从Lambda控制台导航以添加触发器UI。

加载后,用于配置此触发器的UI与上面上面“将计划的事件添加到新的lambda”部分中的屏幕快照相同。

讨论区

对于您的示例案例,您将要使用cron()代替rate()。Lambda中的Cron表达式需要所有字段,并以UTC表示。因此,要每天在下午5点(UTC)运行函数,请使用以下cron表达式:

cron(0 17 * * ? *)

更多资源

笔记

  • 自此功能首次发布以来,此事件类型的名称已从“计划的事件”更改为“ CloudWatch Events-计划”。
  • 在发布此功能之前,针对此问题的推荐解决方案(根据“ AWS Lambda入门42分50秒”)是使用SWF创建计时器,或使用外部应用程序创建计时器。
  • 自预定活动博客文章发布以来,Lambda用户界面已得到全面改进,并且其中的屏幕截图不再准确。有关最新版本,请参阅我从2017年3月10日更新的屏幕截图。

您是否知道1分钟精确支持的希望?
kaptan's

2
这有点hack,但是您可以以1分钟的频率执行此操作youtube.com/watch?v=FhJxTIq81AU
ingh.am 2016年

4
事件源类型现在为“ CloudWatch Events-Schedule”
Guy Daher

@GuyDaher谢谢,我已经相应更新了我的答案。
Anthony Neace

3
它现在支持1分钟速率。docs.aws.amazon.com/lambda/latest/dg/…–
advncd

18

自发布以来,似乎已经提出了另一种解决方案:使用Unreliable Town Clock(UTC)安排重复的AWS Lambda调用,其中作者建议订阅SNS主题Unreliable Town Clock。我既没有使用SWF也没有使用SNS,但在我看来SNS解决方案更简单。这是文章的摘录

不可靠的城市时钟(UTC)

Unreliable Town Clock(UTC)是一个新的免费公共SNS主题(Amazon Simple Notification Service),它每季度每隔一小时向所有订阅者广播“铃声”消息。它可以将提示音发送到AWS Lambda函数,SQS队列和电子邮件地址。

您可以使用chime属性每隔15分钟运行一次代码,或者仅每小时一次(例如,当分钟==“ 00”时)或每天一次(例如,当小时==“ 00”和分钟= =“ 00”)或任何其他系列的间隔。

您甚至可以订阅一个只希望在将来的特定时间仅运行一次的函数:让该函数忽略所有调用,直到它在所需的时间之后。时间到了,它可以执行其工作,然后取消订阅SNS主题。

将您的代码连接到不可靠的城镇时钟非常容易。无需申请流程或创建帐户


9
不再是有效的答案。不可靠的城市时钟不再可用
blueskin

15

新解决方案:Lambda预定作业

Werner Vogel于今晚(10/08)在re:Invent上宣布,AWS Lambda现在拥有自己的调度程序。

硒在对2015年10月8日AWS LAMBDA发行说明

您还可以设置AWS Lambda以使用AWS Lambda控制台定期,定期地调用代码。您可以指定固定汇率(小时,天数或周数),也可以指定cron表达式。有关示例,请参见演练5:使用Lambda函数处理预定事件(Python)


旧解决方案:使用AWS Data Pipeline进行计划

您可以使用AWS Data Pipeline 安排给定时间段的任务。使用ShellCommandActivity配置管道时,该操作可以是任何命令。

例如,您可以运行AWS CLI命令以:

  • 给SQS留言
  • 或直接调用Lambda函数(请参阅invoke

您可以直接在AWS控制台中轻松创建AWS Data Pipeline计划任务(例如,使用AWS CLI命令):

在此处输入图片说明

您还可以使用API 定义计划:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

限制:最小计划间隔为15分钟。
定价:每月约$ 1.00。


9

这是我的方法:

现在,您有了一个分辨率约为15分钟的计时器。

然后,其他Lambda函数将订阅SNS主题,并每15分钟调用一次。


4
该答案基本上是关于可以实现Shadi's Answer中描述的不可靠城镇时钟的一种机制的说明。鉴于UTC的作者警告说它“可能随时在没有警告的情况下消失”,因此您的方法可能要优越得多。
布赖恩

第一个实现-1条消息-可以运行几天,然后停止。看起来定期消息只是没有传递到SQS。增加了2条消息(总计3条消息)-现在已经可以工作一周。在CloudWatch中,我看到了定期未命中-仅发送了2条消息,但计时器滴答作响。要点已更新gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro 2015年

@Brian作为Unreliable Town Clock(townclock.io)的作者,我同意运行自己的东西比依赖某些陌生人(我)可以给您更多的控制权。实际上,我鼓励人们运行自己的Unreliable Town Clock,并在GitHub上发布源代码:github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

由于现在可以轻松地通过HTTP触发lambda函数(例如,使用GET或curl),一个简单的解决方案是使用托管的CRON,如easycron:https ://www.easycron.com/ 来触发lambda函数运行。

我们遇到了同样的问题,最终在python上的Google App Engine上运行了cron服务,因为这允许CRON作业本身具有更大的灵活性和复杂性。


时代变了,Lambda现在支持cron类型的时间表docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee


1

您也可以通过cloudWatch事件安排它。创建规则->附加目标(lambda)并在规则上设置cron / rate明智的计划。


1

Web控制台的方法非常简单。只需CloudWatch为lambda 创建一个规则,然后将其添加到lambda的Triggers标签中即可。

对于那些需要通过自动化的人aws cli,我们可以

  1. 创建功能,
  2. 创建规则
  3. 授予许可,
  4. 链接规则和功能

创建功能

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

建立规则

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'

1

在特定时间间隔内在lambda中运行查询的一种简单方法是为lambda函数设置规则。为此,创建lambda函数后,请转到cloudwatch >>规则>>计划。并定义cron表达式,然后在目标部分中选择要触发的lambda函数。


0

在创建lambda函数时,创建触发器“ CloudWatch Events-Schedule”

现在,您可以在时间表表达式(例如rate = 15 min)中使用AWS预设,也可以使用cron表达式。

在此处输入图片说明

根据您的要求,Cron时间表为“ 0 0 17 1/1 *?*”


-1

Diksha是AWS Team推荐的基于AWS SWF触发器的AWS Lambda Scheduler 。可以使用cron表达式计划作业,还可以指定要运行多少时间,何时开始或何时结束。您可以查看状态以及计划作业的历史记录。安全性由AWS策略管理。

设置diksha引擎后,您可以按以下方式使用cron表达式调度函数:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj“ jobName | functionName | context | 0 0-59 * * * * | 10”

在此作业中,作业将每分钟运行10次。AWS SWF将自行触发功能。

详细信息:https : //github.com/milindparikh/diksha

免责声明:我是该项目的贡献者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.