亚马逊宣布推出AWS Lambda(http://aws.amazon.com/lambda/)。
产品描述包括:
计划任务
AWS Lambda函数可以由外部事件计时器触发,因此可以在定期维护时间或非高峰时段运行功能。例如,您可以触发AWS Lambda函数在非繁忙时段执行夜间归档清理。
当我读到这篇文章时,我明白我终于有办法不断地做“类似cron”的任务了。我想每天下午5点运行一个特定的查询。
但是我没有在文档中的任何地方找到它。他们只提到了programatical事件或来自其他AWS服务的事件的触发器。
我误会了吗?或者有人能指出我的文档?
正如在这个AWS blog post中所宣布的那样,现在支持调度作为称为“CloudWatch Events - Schedule”的event source type(也称为触发器),并且可以表示为速率或cron表达式。
导航到“配置触发器”创建步骤,并指定“CloudWatch事件 - 计划”触发器。示例配置如下:
导航到lambda的“触发器”选项卡,选择“添加触发器”,然后指定“CloudWatch事件 - 计划”触发器。我有一个带有SNS触发器的现有lambda的示例屏幕截图:
加载后,配置此触发器的UI与上面“将计划事件添加到新lambda”部分中的屏幕截图相同。
对于您的示例,您将需要使用cron()
而不是rate()
。 lambda中的Cron表达式需要所有字段并以UTC表示。因此,要在每天下午5点(UTC)运行一个函数,请使用以下cron表达式:
cron(0 17 * * ? *)
lambda-canary
的cron表达式,可以在AWS控制台创建函数期间选择该表达式。
本教程将指导您完成此蓝图的配置。Diksha是基于AWS SWF触发器的AWS Lambda Scheduler,由AWS Team推荐。可以使用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
免责声明:我是该项目的贡献者。
从这篇文章的时间开始,似乎又出现了另一种解决方案:Schedule Recurring AWS Lambda Invocations With The Unreliable Town Clock (UTC),其中作者提议订阅SNS主题不可靠城镇时钟。我既没使用SWF也没使用SNS,但在我看来,SNS解决方案更简单。这是文章的摘录
不可靠的城镇时钟(UTC)
不可靠城镇时钟(UTC)是一个新的,免费的公共SNS主题(亚马逊简单通知服务),每四分钟向所有订户广播一个“编钟”消息。它可以将钟声发送到AWS Lambda函数,SQS队列和电子邮件地址。
您可以使用chime属性每15分钟运行一次代码,或者每小时运行一次代码(例如,当分钟==“00”时)或每天运行一次(例如,当小时==“00”和分钟= =“00”)或任何其他一系列间隔。
您甚至可以订阅一个只想在将来的特定时间运行一次的函数:让函数忽略所有调用,直到它想要的时间之后。什么时候,它可以执行其工作,然后取消订阅自己的SNS主题。
将您的代码连接到Unreliable Town Clock是快速而简单的。无需申请流程或帐户创建
Werner Vogel今晚(10/08)在re:Invent上宣布AWS Lambda现在拥有自己的调度程序。
选择AWS Lambda release note on 2015-10-08:
您还可以使用AWS Lambda控制台设置AWS Lambda以定期调度您的代码。您可以指定固定费率(小时数,天数或周数),也可以指定cron表达式。有关示例,请参阅Walkthrough 5: Using Lambda Functions to Process Scheduled Events (Python)。
您可以将AWS Data Pipeline用于schedule给定期间的任务。使用ShellCommandActivity配置管道时,操作可以是任何命令。
例如,您可以运行AWS CLI命令:
您可以直接在AWS控制台中轻松创建AWS Data Pipeline计划任务(例如,使用AWS CLI命令):
您也可以使用API来define您的日程安排:
{
"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分钟的计时器。
然后其他Lambda函数订阅SNS主题并每15分钟调用一次。
由于现在easily possible通过HTTP触发lambda函数(例如使用GET或curl),一个简单的解决方案是使用像easycron这样的托管CRON:https://www.easycron.com/来触发lambda函数运行。
我们遇到了同样的问题,最终在python中运行了Google App Engine上的cron服务,因为这样可以提高CRON作业本身的灵活性和复杂性。
Web控制台的方式非常简单。只需为lambda创建一个CloudWatch
规则,并将其添加到lambda的Triggers
选项卡中。
对于那些需要使用aws cli
自动化的人,我们可以
创建功能
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"}]'
在lambda中以特定时间间隔运行查询的简单方法是为lambda函数设置规则。在创建lambda函数之后转到cloudwatch >> rules >> schedule。并定义cron表达式,并在目标部分选择要触发的lambda函数。
您也可以使用cloudWatch事件安排它。创建规则 - >附加目标(lambda)并在规则上设置cron / rate wise计划。
在创建lambda函数时创建触发器“CloudWatch Events - Schedule”
现在,您可以在计划表达式中使用AWS预设,例如rate = 15 min,也可以使用cron表达式。
根据您的要求,Cron Schedule是“0 0 17 1/1 *?*”