AWS Lambda计划任务

问题描述 投票:119回答:10

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

产品描述包括:

计划任务

AWS Lambda函数可以由外部事件计时器触发,因此可以在定期维护时间或非高峰时段运行功能。例如,您可以触发AWS Lambda函数在非繁忙时段执行夜间归档清理。

当我读到这篇文章时,我明白我终于有办法不断地做“类似cron”的任务了。我想每天下午5点运行一个特定的查询。

但是我没有在文档中的任何地方找到它。他们只提到了programatical事件或来自其他AWS服务的事件的触发器。

我误会了吗?或者有人能指出我的文档?

amazon-web-services cron-task aws-lambda
10个回答
143
投票

2015年10月8日增加了对预定活动的原生支持:

正如在这个AWS blog post中所宣布的那样,现在支持调度作为称为“CloudWatch Events - Schedule”的event source type(也称为触发器),并且可以表示为速率或cron表达式。

将计划事件添加到新的lambda

导航到“配置触发器”创建步骤,并指定“CloudWatch事件 - 计划”触发器。示例配置如下:

Image that shows configuration for creating a scheduled event at 5pm UTC.

将计划事件添加到现有lambda

导航到lambda的“触发器”选项卡,选择“添加触发器”,然后指定“CloudWatch事件 - 计划”触发器。我有一个带有SNS触发器的现有lambda的示例屏幕截图:

Image that shows how to navigate to add trigger UI from Lambda console.

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

讨论

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

cron(0 17 * * ? *)

更多资源

笔记

  • 自此功能首次发布以来,此事件类型的名称已从“预定事件”更改为“CloudWatch事件 - 计划”。
  • 在此功能发布之前,针对此问题的建议解决方案(根据"Getting Started with AWS Lambda" at 42min 50secs)是针对use SWF to create a timer,或者是使用外部应用程序创建计时器。
  • 自定期活动博客文章发布以来,Lambda用户界面已经彻底检查,其中的屏幕截图不再精确。有关最新修订,请参阅我在2017年3月3日上方的更新截图。

0
投票

在“功能”页面的“添加触发器”中,您可以添加CloudWatch事件,并将其设置为计划类型

enter image description here


-1
投票

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

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


16
投票

从这篇文章的时间开始,似乎又出现了另一种解决方案: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是快速而简单的。无需申请流程或帐户创建


14
投票

新解决方案:Lambda计划作业

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进行调度

您可以将AWS Data Pipeline用于schedule给定期间的任务。使用ShellCommandActivity配置管道时,操作可以是任何命令。

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

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

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

enter image description here

您也可以使用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" }
      ]
    }
  ]
}

Limits:最短调度间隔为15分钟。 Pricing:每月约1.00美元。


7
投票

我是这样做的:

现在你有一个约15分钟的计时器。

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


4
投票

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

我们遇到了同样的问题,最终在python中运行了Google App Engine上的cron服务,因为这样可以提高CRON作业本身的灵活性和复杂性。


1
投票

Web控制台的方式非常简单。只需为lambda创建一个CloudWatch规则,并将其添加到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 >> rules >> schedule。并定义cron表达式,并在目标部分选择要触发的lambda函数。


0
投票

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


0
投票

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

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

根据您的要求,Cron Schedule是“0 0 17 1/1 *?*”

© www.soinside.com 2019 - 2024. All rights reserved.