AWS Lambda计划任务
亚马逊宣布AWS Lambda( http://aws.amazon.com/lambda/ )。
产品说明包括:
计划任务
AWS Lambdafunction可以由外部事件定时器触发,因此可以在定期维护时间或非高峰时段运行function。 例如,您可以触发AWS Lambdafunction,在非繁忙时段执行夜间归档清理。
当我读到这些时,我明白我终于可以有办法一贯地做“类似cron”的任务。 我想要在5PM每天运行一个特定的查询。
不过,我在文档中找不到这个地方。 他们只提及程序事件的触发器,或其他AWS服务的事件。
我误解了吗? 或者可以有人指向我的文档?
对计划事件的本机支持已于2015年10月8日添加:
正如本AWS博客文章中所宣布的那样,调度现在支持作为事件源types (也称为触发器),名为“ CloudWatch Events – Schedule ”,可以表示为rate或cronexpression式。
将计划事件添加到新的lambda
导航到“configuration触发器”创build步骤,并指定“CloudWatch Event – Schedule”触发器。 下面的示例configuration:
将计划事件添加到现有的lambda
导航到您的lambda的“触发器”选项卡,select“添加触发器”,并指定“CloudWatch Event – Schedule”触发器。 示例屏幕截图我有一个现有的带有SNS触发器的lambda:
加载后,用于configuration此触发器的UI与上面的“将计划的事件添加到新的lambda”一节中的屏幕截图相同。
讨论
对于你的例子,你会想使用cron()
而不是rate()
。 lambda中的Cronexpression式需要所有字段并以UTC表示。 所以每天下午5点(UTC)运行一个函数,使用下面的cronexpression式:
cron(0 17 * * ? *)
更多资源
- AWS文档 – 使用Rate或Cron计划expression式
- AWS文档 – 使用AWS CLI按计划运行AWS Lambdafunction
- AWS文档 – 教程:在预定事件中使用AWS Lambda
- AWS提供了一个示例“蓝图”,该示例使用称为
lambda-canary
的cronexpression式,可以在从AWS控制台创build函数的过程中select它。 - 本教程将引导您完成此蓝图的configuration。
- AWS提供了一个示例“蓝图”,该示例使用称为
笔记
- 自该function首次发布以来,此事件types的名称已从“计划事件”更改为“CloudWatch Events – 计划”。
- 在此function发布之前,针对此问题的推荐解决scheme(每个“在42分50秒内使用AWS Lambda入门” )是使用SWF创build计时器 ,或使用外部应用程序创build计时器。
- 自定义事件博客文章发布以来,Lambda UI已被彻底修改,其中的屏幕截图不再精确。 从3/10/2017上面查看我最新修订版的截图。
自从本文发布之后,似乎又出现了另一种解决scheme: 使用不可靠的城市时钟(UTC)调度AWS Lambda Invocations ,作者build议订阅SNS主题Unreliable Town Clock 。 我既不使用SWF也不使用SNS,但在我看来,SNS解决scheme更简单。 这是文章的摘录
不可靠的城市时钟(UTC)
不可靠的城市时钟(UTC)是一个新的免费的公共SNS主题(亚马逊简单通知服务),每隔一个小时向所有用户广播一个“钟声”消息。 它可以将铃声发送到AWS Lambda函数,SQS队列和电子邮件地址。
您可以使用chime属性每隔15分钟运行一次代码,或者每小时运行一次代码(例如分钟==“00”)或每天一次(例如,当小时==“00”和分钟= =“00”)或任何其他系列的间隔。
你甚至可以订阅一个你只想在以后的特定时间只运行一次的函数:让这个函数忽略所有的调用,直到它超过它想要的时间。 到时候,它可以执行自己的工作,然后退出SNS主题。
将您的代码连接到不可靠的城市时钟是快速和容易的。 不需要申请过程或帐户创build
新解决scheme:Lambda计划作业
Werner Vogel今天(10/08)宣布:发明AWS Lambda现在拥有自己的调度程序。
请参阅2015-10-08上的AWS Lambda发行说明 :
您还可以设置AWS Lambda以使用AWS Lambda控制台定期调度您的代码。 您可以指定固定费率(小时数,天数或周数),也可以指定cronexpression式。 有关示例,请参阅演练5:使用Lambda函数处理计划事件(Python) 。
OLD SOLUTION:使用AWS数据pipe道进行计划
您可以使用AWS Data Pipeline来安排具有给定时间段的任务。 当您使用ShellCommandActivityconfigurationpipe道时,该操作可以是任何命令。
例如,您可以运行AWS CLI命令来:
- 给SQS留言
- 或直接调用Lambda函数 (请参阅调用 )
您可以轻松地在AWS控制台内直接创buildAWS 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。
下面是我如何做到这一点:
-
创buildLambda其中:
- 清除SQS
- 发送消息延迟10分钟
- https://gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
-
为1分钟创buildCloudWatch闹钟:ApproximateNumberOfMessagesVisible> 0
- 订阅SNS主题到闹钟
- 订阅Lambda到SNS主题
现在你有一个约15分钟的分辨率的计时器。
然后,其他Lambda函数订阅SNS主题并每15分钟调用一次。
由于现在很容易通过HTTP触发lambdafunction(例如,使用GET或curl),一个简单的解决scheme是使用像easycron这样的托pipeCRON: https ://www.easycron.com/来触发您的lambda函数运行。
我们遇到了同样的问题,最终在python上的Google App Engine上运行了一个cron服务,因为这使得CRON作业本身具有更大的灵活性和复杂性。
您也可以使用cloudWatch事件来安排它。 创build规则 – >附加目标(lambda),并在规则上设置cron / rate明智的时间表。
在创buildlambda函数时创build触发器“CloudWatch Events – Schedule”
现在,您可以在计划expression式中使用AWS预设,例如rate = 15分钟,也可以使用cronexpression式。
根据您的要求,Cron Schedule是“0 0 17 1/1 *?*”
networking控制台的方式非常简单。 只需为lambda创build一个CloudWatch
规则,并将其添加到lambda的Triggers
选项卡中即可。
对于那些需要自动化的人来说,我们可以
- 创buildfunction,
- 创build规则,
- 授予许可,
- 链接规则和function
创buildfunction
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}
创build规则
## 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"}]'
Diksha是AWS Team推荐的基于AWS SWF触发器的AWS Lambda调度程序。 可以使用cronexpression式来调度作业,也可以指定要运行多less次,何时开始或何时结束。 您可以查看计划任务的状态以及历史logging。 安全性由AWS策略pipe理。
一旦你设置了diksha引擎,你可以按照以下的方式使用cronexpression式来调度函数:
java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj“jobName | functionName | context | 0 0-59 * * * * | 10”
在这份工作中,工作每分钟运行10次。 AWS SWF将自行触发function。
详情: https : //github.com/milindparikh/diksha
免责声明:我是该项目的贡献者。