165

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

产品描述包括:

计划任务

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

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

但是我在文档中的任何地方都找不到这个。他们只提到程序事件或来自其他 AWS 服务的事件的触发器。

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

4

13 回答 13

170

2015 年 10 月 8 日添加了对预定事件的本机支持:

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

将计划事件添加到新的 lambda

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

显示用于在 UTC 下午 5 点创建计划事件的配置的图像。

将计划事件添加到现有 lambda

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

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

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

讨论

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

cron(0 17 * * ? *)

更多资源

笔记

  • 自此功能首次发布以来,此事件类型的名称已从“Scheduled Event”更改为“CloudWatch Events - Schedule”。
  • 在发布此功能之前,针对此问题的推荐解决方案(根据“AWS Lambda 入门”,时间为 42 分 50 秒)是使用 SWF 创建计时器,或使用外部应用程序创建计时器。
  • 自从预定的活动博客文章发布以来,Lambda UI 已经大修,其中的屏幕截图不再准确。有关最新修订,请参阅上面我从 2017 年 3 月 10 日更新的屏幕截图。
于 2014-12-09T15:11:09.663 回答
19

自从发表这篇文章以来,似乎出现了另一种解决方案:使用不可靠的城镇时钟 (UTC) 安排重复的 AWS Lambda 调用,其中作者建议订阅 SNS 主题不可靠的城镇时钟。我既没有使用 SWF 也没有使用 SNS,但在我看来 SNS 解决方案更简单。这是文章的摘录

不可靠的城镇时钟 (UTC)

不可靠的城镇时钟 (UTC) 是一个新的、免费的公共 SNS 主题(Amazon Simple Notification Service),它每一刻钟向所有订阅者广播一条“钟声”消息。它可以将提示音发送到 AWS Lambda 函数、SQS 队列和电子邮件地址。

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

你甚至可以订阅一个你只想在未来特定时间运行一次的函数:让函数忽略所有调用,直到它在它想要的时间之后。时间到了,它可以执行它的工作,然后取消订阅 SNS 主题。

将您的代码连接到 Unreliable Town Clock 既快速又简单。无需申请流程或帐户创建

于 2015-07-11T07:09:20.233 回答
17

新解决方案:Lambda 计划作业

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

请参阅 2015-10-08 上的AWS Lambda 发行说明

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


旧解决方案:使用 AWS Data Pipeline 进行调度

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

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

  • 向 SQS 发送消息
  • 或直接调用 Lambda 函数(请参阅调用

您可以直接在 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 美元。

于 2015-08-21T11:15:59.027 回答
9

这是我的做法:

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

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

于 2015-07-14T19:07:12.750 回答
4

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

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

于 2015-07-30T06:59:03.787 回答
2

在 AWS 中作为 cron 运行

使用 cloudformation 为您的 lambda 设置 cloudwatch 计划事件触发器的示例。


  LambdaSchedule:
    Type: "AWS::Events::Rule"
    Properties:
      Description: A schedule for the Lambda function..
      ScheduleExpression: rate(5 minutes)
      State: ENABLED
      Targets:
        - Arn: !Sub ${LambdaFunction.Arn}
          Id: LambdaSchedule

  LambdaSchedulePermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Sub ${LambdaFunction.Arn}
      Principal: 'events.amazonaws.com'
      SourceArn: !Sub ${LambdaSchedule.Arn}

  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Description: Scheduled lambda to run every 5 minutes
      CodeUri: ./build/package.zip
      Handler: index.lambda_handler
      MemorySize: 128
      Runtime: python3.6
于 2020-08-20T20:45:24.167 回答
2

在 Function 页面的 Add trigger 中,您可以添加 CloudWatch Events,并将其设置为计划类型

在此处输入图像描述

于 2019-08-03T05:09:40.390 回答
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"}]'
于 2017-02-13T22:33:10.593 回答
1

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

于 2019-03-08T10:29:52.463 回答
1

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

于 2016-06-28T14:41:15.713 回答
0

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

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

在此处输入图像描述

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

于 2017-01-29T18:25:03.757 回答
0

发布时间 - 2021 年 6 月 27 日

您可以使用Amazon EventBridge安排 AWS Lambda 函数 我正在使用 AWS 管理控制台

  1. 选择您的 Lambda 函数并在配置中选择“触发器” 在此处输入图像描述

  2. 选择EventBridge(CloudWatch Events) - 基本上这是流行答案之一的最新版本(使用 CloudWatch 触发器)。在此处输入图像描述

  3. 创建新规则- 添加详细信息。我的 lambda 将在UTC 每天下午 4 点 触发在此处输入图像描述

于 2021-06-26T20:37:55.757 回答
-1

Diksha 是AWS 团队推荐的基于 AWS SWF 触发器的 AWS Lambda 调度程序。可以使用 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

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

于 2015-08-14T13:45:59.113 回答