AWS Lambda 定时任务

173
亚马逊宣布了 AWS Lambda (http://aws.amazon.com/lambda/)。
该产品描述包括:

定时任务

AWS Lambda 函数可以通过外部事件触发器进行触发,因此函数可以在定期维护时间或非高峰小时运行。例如,您可以在空闲时间触发 AWS Lambda 函数以执行每晚的归档清理。

当我阅读此内容时,我明白了我终于可以有一种一致地执行“cron-like”任务的方法了。比如说,我想每天下午5点运行一个特定的查询。
然而,我在文档中找不到任何信息。他们只提到程序事件或其他 AWS 服务的触发器。
是我误解了吗?还是有人能够将我指向文档呢?
16个回答

176

2015年10月8日添加了本地支持计划事件:

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

向新的lambda添加预定事件

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

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

向现有的 Lambda 添加定时事件

导航至 Lambda 的“触发器”选项卡,选择“添加触发器”,并指定“CloudWatch Event - Schedule”触发器。以下是一个示例截图,其中我已经为 Lambda 添加了 SNS 触发器:

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

一旦加载完成,配置此触发器的用户界面与上面“将计划事件添加到新lambda”部分中的截图完全相同。
讨论
对于您的示例案例,您需要使用而不是。 Lambda中的cron表达式需要所有字段,并以UTC表示。因此,要在每天下午5点(UTC)运行函数,请使用以下cron表达式:
cron(0 17 * * ? *)

更多资源

注意事项

  • 自该功能首次发布以来,“Scheduled Event”的事件类型名称已更改为“CloudWatch Events - Schedule”。
  • 在此功能发布之前,解决此问题的推荐解决方案(根据 "开始使用 AWS Lambda" 的42分50秒)是使用 SWF 创建定时器或使用外部应用程序创建定时器。
  • 自计划事件博客文章发布以来,Lambda UI已进行了全面改版,其中的屏幕截图不再准确。请参见我在2017年3月10日更新的最新修订版截图。

3
这个方法有点取巧,但你可以用它来实现每分钟一次的频率。https://www.youtube.com/watch?v=FhJxTIq81AU - ingh.am
3
现在它支持1分钟的速率。 http://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html - advncd

19
自此贴文发布以来,似乎出现了另一个解决方案:使用不可靠的小镇时钟(UTC)安排AWS Lambda定期调用,在其中作者建议订阅SNS主题Unreliable Town Clock。我都没有使用SWF和SNS,但我认为SNS解决方案更简单。以下是文章的摘录。

不可靠的小镇时钟(UTC)

不可靠的小镇时钟(UTC)是一个新的、免费的、公共的SNS主题(Amazon简单通知服务),每隔15分钟向所有订阅者广播“钟声”消息。它可以将钟声发送到AWS Lambda函数、SQS队列和电子邮件地址。

您可以使用钟声属性每隔15分钟运行代码,或仅在每小时运行代码一次(例如,当分钟=="00"时)或每天运行一次代码(例如,当小时=="00"并且分钟=="00"时),或任何其他间隔序列。

您甚至可以订阅一个只想在未来特定时间运行一次的函数:让该函数忽略所有调用,直到超过它想要的时间。当时间到达后,它可以执行其工作,然后从SNS主题中取消订阅自己。

将您的代码连接到不可靠的小镇时钟非常快速和简单。无需申请过程或账户创建


9
无效的答案。不可靠的市政钟已经不再可用。 - Chenna V

17

新解决方案:Lambda计划任务

Werner Vogel在re:Invent大会上宣布,AWS Lambda现在拥有自己的调度程序。

请参阅2015年10月8日的AWS Lambda发布说明:

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


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

您可以使用AWS Data Pipeline 安排具有给定周期的任务。当您使用ShellCommandActivity配置Pipeline时,操作可以是任何命令。

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

  • 将消息放入SQS
  • 或直接调用Lambda函数(请参见调用

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

enter image description here

您也可以使用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美元。


9
这是我的做法:

现在您拥有了大约15分钟分辨率的计时器。

然后,其他Lambda函数已经订阅了SNS主题,并且每隔15分钟被调用一次。


4
这个答案基本上是为了实现“不可靠镇钟”而提供的一种机制的说明,该机制在 Shadi's Answer 中有描述。鉴于UTC的作者警告称它“可能随时消失”,你的方法可能更加优越。 - Brian
第一次实现 - 1 条消息 - 工作了几天后停止。看起来周期性地消息没有被传递到 SQS。添加了另外两条消息(总共 3 条)- 现在已经工作了一个星期。在 CloudWatch 中,我看到周期性的漏传 - 只有 2 条消息被传递,但计时器仍然正常运行。Gist 已经更新 https://gist.github.com/mikeplavsky/5ffe7e33e0d70a248537 - maplpro
作为《不可靠的城镇时钟》(http://townclock.io)的作者,我同意自己运行比依赖某个陌生人(比如我)更具有控制性。事实上,我鼓励大家运行自己的《不可靠的城镇时钟》,并已在GitHub上发布了源代码:https://github.com/alestic/alestic-unreliable-town-clock - Eric Hammond

4
由于现在已经 很容易地 通过 HTTP 触发 Lambda 函数(例如使用 GET 或 curl),因此一个简单的解决方案是使用像 easycron 这样的托管 CRON:https://www.easycron.com/ 来触发您的 Lambda 函数运行。
我们遇到了同样的问题,最终在 Google App Engine 上以 Python 运行 cron 服务,因为这允许在 CRON 作业本身中具有更多的灵活性和复杂性。

时代已经改变,Lambda现在支持开箱即用的cron类型调度。http://docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html - D2TheC

3
在“函数”页面的“添加触发器”选项中,你可以添加一个云监控事件,并将其设置为定时类型。 enter image description here

3
AWS最近(2022年11月10日)推出了一个新的服务,称为EventBridge Scheduler,或者您也可以选择EventBridge Rules。根据您在这里的示例,我将在每天早上5点触发一个事件。正如您所看到的,它还显示了接下来的10个触发日期和时间,这将帮助我们在做任何事情之前手动检查我们的cron。

请注意,如果您想在特定的日期和时间开始此计划,请选择EventBridge Scheduler。它有一个Timeframe选项。如果您想了解更多关于Timeframe的信息,请查看这个answer

enter image description here

在目标部分,您可以选择35个 AWS Lambda函数选项。

enter image description here

希望这能对你有所帮助。

2

在AWS中作为cron运行

这是一个使用CloudFormation设置CloudWatch定时事件触发Lambda函数的示例。


  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

2

发布日期-2021年6月27日

您可以使用Amazon EventBridge调度AWS Lambda函数。这里我使用AWS Management Console

  1. 选择Lambda函数,然后在配置中选择"Triggers"enter image description here

  2. 选择EventBridge(CloudWatch Events)-基本上这是一个流行答案的最新版本(使用CloudWatch触发器)。enter image description here

  3. 创建新规则-添加详细信息。我的lambda将在每天UTC下午4点被触发 enter image description here


1

EventsBridge(CloudWatch)解决方案:

您可以创建一个AWS Events Bridge规则,并将Lambda函数设置为目标,使用它的ARN。您可以指定一个速率或cron计划表达式。例如,以下表达式将在所有工作日每十分钟后运行您的Lambda函数。

schedule = "cron(0/10 * ? * MON-FRI *)"

注意,您的EventsBridge角色还需要lambda:InvokeFunction权限,以便EventsBridge可以触发Lambda函数。
这是一个完整的教程,介绍了这种架构的Terraform设置:https://medium.com/geekculture/terraform-setup-for-scheduled-lambda-functions-f01931040007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接