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:

显示UTC时间下午5点创建预定事件的配置的图像。

将计划事件添加到现有的lambda

导航到您的lambda的“触发器”选项卡,select“添加触发器”,并指定“CloudWatch Event – Schedule”触发器。 示例屏幕截图我有一个现有的带有SNS触发器的lambda:

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

加载后,用于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。

笔记

  • 自该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。

下面是我如何做到这一点:

现在你有一个约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选项卡中即可。

对于那些需要自动化的人来说,我们可以

  1. 创buildfunction,
  2. 创build规则,
  3. 授予许可,
  4. 链接规则和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

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