任务调度

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

产品说明包括:

计划任务

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

当我读到这篇文章时,我明白了我终于可以有一种方法来持续地执行“ cron-like”任务了。我想运行一个具体的查询每天下午5点让我们说。

然而,我在文档中找不到这一点。它们只提到编程事件上的触发器,或来自其他 AWS 服务的事件。

是我理解错了吗? 还是有人能给我指一下文件?

76186 次浏览

2015年10月8日增加的对预定活动的本地支持:

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

将调度事件添加到新的 lambda

导航到创建的“ Configurgers”步骤,并指定“ CloudWatch Event-Scheme”触发器:

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

将调度事件添加到现有的 lambda

导航到 lambda 的“ Triggers”选项卡,选择“ Add Trigger”,并指定“ CloudWatch Event-Scheder”触发器。示例截图,其中我有一个带 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 Events-Scheme”。
  • 在这个特性发布之前,这个问题的推荐解决方案(根据 “开始使用 AWS Lambda”42分50秒)是 使用 SWF 创建计时器,或者用外部应用程序创建一个计时器。
  • 自从预定的事件博客文章发布以来,Lambda UI 已经进行了大修,其中的屏幕截图不再精确。请看我在2017年3月10日更新的截图以获得最新的修订版。

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

不可靠的城市时钟(协调世界时)

不可靠的城市时钟(UTC)是一个新的,免费的,公开的 SNS 话题 (亚马逊简单通知服务)广播“编钟”消息 每一刻钟向所有用户发送一次。它可以将钟声发送到 AWS Lambda 函数、 SQS 队列和电子邮件地址。

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

您甚至可以订阅一个只想在 将来的特定时间: 让函数忽略所有调用 直到它过了它想要的时间。当它到了时间,它可以执行 然后把自己从 SNS 主题退订。

将您的代码连接到不可靠的城市时钟是快速和容易的。不 申请程序或帐户创建是必需的

因为现在是 轻而易举通过 HTTP 触发 lambda 函数(例如使用 GET 或 curl) ,所以一个简单的解决方案是使用托管 CRON (如 easycron: https://www.easycron.com/)来触发 lambda 函数运行。

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

Diksha 是基于 AWS 小组推荐的 AWS SWF 触发器的 AWS Lambda 调度器。可以使用 cron 表达式调度作业,还可以指定要运行多少次、何时开始或何时结束。您可以查看计划作业的状态和历史记录。安全性由 AWS 策略管理。

一旦设置了 diksha 引擎,就可以按照以下方式使用 cron 表达式调度函数:

Java-jar diksha-client-0.0.1.jar-lcfg cf1-cj“ jobName | function Name | context | 00-59 * * * * | 10”

该作业每分钟运行10次,AWS SWF 将自动触发功能。

详情: https://github.com/milindparikh/diksha

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

新的解决方案: Lambda 计划工作

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

如果 AWS Lambda 2015-10-08发布说明:

您还可以设置 AWS Lambda 来调用您的代码, 可以使用 AWS Lambda 控制台指定一个固定的 或者您可以指定一个 cron 例如,请参见演练5: 使用 Lambda 函数 处理计划事件(Python) .


旧的解决方案: 使用 AWS 数据流水线进行调度

可以使用 AWS 数据管道对具有给定周期的任务进行 时间表。使用 < strong > ShellCommandActivity 配置管道时,操作可以是任何命令。

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

  • 将消息放到 SQS
  • 或直接 调用 Lambda 函数(见 调用)

您可以很容易地在 AWS 控制台中直接创建 AWS 数据管道计划任务(例如,使用 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.00美元。

您也可以将它与 CloudWatch 事件一起安排。创建 rule-> 附加 target (lambda)并在规则上设置 cron/rate wise 进度表。

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

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

enter image description here

根据您的要求,Cron 进度表是“00171/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"}]'

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

在“函数”页中的“添加触发器”中,可以添加一个 CloudWatch Events,并将其作为计划类型

enter image description here

在 AWS 中作为 cron 运行

这是一个示例,用于为您的 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

张贴-2021年6月27日

您可以使用 < strong > Amazon EventBridge 调度 AWS Lambda 函数 这里我使用的是 AWS Management < strong > Console

  1. 选择您的 Lambda 函数,并在配置中选择 “触发器” < a href = “ https://i.stack.imgur.com/uQs2f.png”rel = “ nofollow noReferrer”> < img src = “ https://i.stack.imgur.com/uQs2f.png”alt = “ enter image description here”/>

  2. 选择 EventBridge (CloudWatch Events)-基本上这是一个流行答案的最新版本(使用 CloudWatch 触发器)。译自: 美国《科学》杂志网站(https://i.stack.imgur.com/Vla73.png)原文地址: http://i.stack.imgur.com/Vla73.png

  3. 创建一个新规则 -添加细节。我的 lambda 将在 世界协调时下午4点 每天< img src = “ https://i.stack.imgur.com/3Q1H7.png”alt = “ enter image description here”/> < img src = “ https://i.stack.imgur.com/3Q1H7.png”alt = “在这里输入图片描述”/> 触发。

下面是使用 Serverless 部署调度 Lambda 以每10分钟运行一次的示例。函数处理程序位于 src/Scheded/index.handle,速率在 Lambda 的设置中指定。AWS 现在使用 EventBridge 来控制应该何时调用 Lambda。这些都是在使用 Serverless 时为您自动设置的。您可以通过查看 Lambda 或通过查看 EventBridge 部分中的“默认”EventBridge 来查看 AWS 控制台中的设置。

Https://carova.io/snippets/serverless-aws-lambdafunction-scheduled-cronjob

EventsBridge (CloudWatch)解决方案:

您可以创建一个 AWS 事件桥规则,并使用其 ARN 将一个 Lambda 函数设置为 目标。可以指定 比率或计算时间表表达式。例如,下面的表达式将在 每个工作日每十分钟一次之后运行 Lambda 函数。

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

注意,EventsBridge 角色还需要 lambda:InvokeFunction权限,这样 EventsBridge 才能触发 Lambda 函数。

这里有一个关于这个架构的 Terraform 设置的完整教程: https://medium.com/geekculture/terraform-setup-for-scheduled-lambda-functions-f01931040007

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

请注意,如果您想在特定的日期和时间开始这个时间表,请选择 EventBridge 调度器。它有一个 时间表选项。如果你想知道更多关于 时间表的信息,请看看这个 回答

enter image description here

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

enter image description here

希望这个能帮到你。