使用Java和CloudWatch触发器安排AWS-Lambda

时间:2019-02-01 09:37:29

标签: spring-boot amazon-s3 amazon-ec2 aws-lambda amazon-cloudwatch

我是AWS和AWS-Lambdas的新手。我必须创建一个lambda函数以每10分钟运行一次cron作业。我打算添加一个Cloudwatch触发器,以每10分钟触发一次,但不会发生任何事件。我在互联网上查了一下,发现需要进行一些操作才能使其运行。

我需要弄清楚一点,并指出以下两点:

  • 我可以使用AWS-Lambda计划一项工作,同时使用Cloudwatch在10分钟内触发该任务,而不会发生任何事件。
  • 如何使其与AWS上托管的MySQL数据库进行交互。

我让我的应用程序基于SpringBoot构建,并在具有共享数据库的多个实例上运行(单个事实来源)。我已经使用Spring的内置调度程序设计了上述所有内容,并使用锁在数据库级别进行了适当的同步,但是由于实例的分布式性质,建议使用lambda进行相同的操作。

2 个答案:

答案 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事件运行cronjob是唯一的选择。
  • 如果您不想使用cloudwatch事件,请继续使用EC2实例。但是EC2会比cloudwatch事件花费更多。

注意: Cloudwatch事件规则Steup就像在任何linux系统中的crontab中定义cronjob一样。在linux serevr中,您将所有内容定义为RAW,但此处仅是基于UI的。