我是AWS和AWS-Lambdas的新手。我必须创建一个lambda函数以每10分钟运行一次cron作业。我打算添加一个Cloudwatch触发器,以每10分钟触发一次,但不会发生任何事件。我在互联网上查了一下,发现需要进行一些操作才能使其运行。
我需要弄清楚一点,并指出以下两点:
我让我的应用程序基于SpringBoot构建,并在具有共享数据库的多个实例上运行(单个事实来源)。我已经使用Spring的内置调度程序设计了上述所有内容,并使用锁在数据库级别进行了适当的同步,但是由于实例的分布式性质,建议使用lambda进行相同的操作。
答案 0 :(得分:1)
您需要将ScheduledEvent对象传递给lambda的handleRequest()。
handleRequest(ScheduledEvent事件,Contex上下文)
配置一个cron作业,该作业在cloudwatch模板中每10分钟运行一次(如果使用cloudformation)。这样可以确保每10分钟触发一次lambda。
确保将以下提到的依赖项添加到pom中。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>2.2.5</version>
</dependency>
方法2:
您可以在cloudformation模板中指定类似的内容。如果您不需要任何与事件相关的信息,则不需要将任何参数传递给您的handler()。这将根据您的cron作业自动触发您的lambda。
"ScheduledRule": {
"Type": "AWS::Events::Rule",
"Properties": {
"Description": "ScheduledRule",
"ScheduleExpression": {
"Fn::Join": [
"",
[
"cron(",
{
"Ref": "ScheduleCronExpression"
},
")"
]
]
},
"State": "ENABLED",
"Targets": [
{
"Arn": {
"Fn::GetAtt": [
"LAMBDANAME",
"Arn"
]
},
"Id": "TargetFunctionV1"
}
]
}
},
"PermissionForEventsToInvokeLambdaFunction": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": {
"Ref": "NAME"
},
"Action": "lambda:InvokeFunction",
"Principal": "events.amazonaws.com",
"SourceArn": {
"Fn::GetAtt": [
"ScheduledRule",
"Arn"
]
}
}
}
}
答案 1 :(得分:0)
注意: Cloudwatch事件规则Steup就像在任何linux系统中的crontab中定义cronjob一样。在linux serevr中,您将所有内容定义为RAW,但此处仅是基于UI的。