【问题标题】:Schedule AWS-Lambda with Java and CloudWatch Triggers使用 Java 和 CloudWatch 触发器安排 AWS-Lambda
【发布时间】:2019-06-25 20:43:55
【问题描述】:

我是 AWS 和 AWS-Lambda 的新手。我必须创建一个 lambda 函数来每 10 分钟运行一次 cron 作业。我计划添加一个 Cloudwatch 触发器,以每 10 分钟触发一次,但没有任何事件。我在互联网上查找,发现需要一些事件才能使其运行。

我需要弄清楚以下两点:

  • 我可以在 10 分钟内使用 AWS-Lambda 和 cloudwatch 在没有任何事件的情况下触发相同的任务来安排作业吗?
  • 如何让它与托管在 AWS 上的 MySQL 数据库交互。

我在 SpringBoot 上构建了我的应用程序,该应用程序运行在具有共享数据库(单一事实来源)的多个实例上。我已经使用 Spring 的内置调度程序设计了上述所有内容,并使用锁在 DB 级别进行了适当的同步,但由于实例的分布式特性,我被建议使用 lambdas 来做同样的事情。

【问题讨论】:

  • 请问为什么不能使用 Cloudwatch 事件?
  • 我想但不知道怎么做。这就是为什么在互联网上寻找资源或教程的原因。

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


【解决方案1】:
  • 如果您想从 cloudwatch 事件运行 cronjob 是唯一的选择。
  • 如果您不想使用 cloudwatch 事件,请继续使用 EC2 实例。但 EC2 比 cloudwatch 活动花费更多。

注意: Cloudwatch events rule steup 就像在任何 linux 系统的 crontab 中定义 cronjob 一样,没什么大不了的。在 linux serevr 中,您会将所有内容定义为 RAW,但在这里它只是基于 UI 的。

【讨论】:

  • 什么是事件正是我的难题。我只需要在 10 分钟后执行这项工作,仅此而已。如何使用 cloudwatch 做到这一点?我在互联网上看过视频,其中他们使用一些字符串/json 在控制台上触发/测试它。是否可以仅通过单击测试按钮而不指定任何输入进行测试?
  • 该字符串/json 是您的 lambda 的输入。如果您不想执行任何输入,请将其留空
  • 如果我留空,那么默认情况下会被cloudwatch事件触发吗?
  • 是的,确实如此。只需在事件源下填写 event sourceschedule 并在目标部分配置您的 lambda。然后在下一个屏幕中为您的规则命名。
  • public String handleRequest(SimpleLambdaMessage message, Context context) {} 它等待 SimpleLambdaMessage 根据我的理解触发它,但在我的场景中,我不想要任何请求,只想在 10 之后触发它分钟。我该如何处理?对于延迟回复,我真的很抱歉。
【解决方案2】:

您需要将 ScheduledEvent 对象传递给 lambda 的 handleRequest()。

handleRequest(ScheduledEvent 事件,上下文上下文)

在您的 cloudwatch 模板中配置一个每 10 分钟运行一次的 cron 作业(如果使用 cloudformation)。这将确保每 10 分钟触发一次 lambda。

确保将下面提到的依赖项添加到您的 pom 中。

<dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>2.2.5</version>
    </dependency>

方法二:

您可以在 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"
                ]
            }
        }
    }
}

【讨论】:

  • 事件是否封装了一些数据?最重要的是,我不需要任何输入来执行我的任务。所以基本上云监视触发器对我来说是一个事件,而 ScheduledEvent 是为此类云监视事件请求指定的类?
  • 那么就不需要传递任何参数了。如果您使用的是 cloudformation,您可以简单地在模板中指定 ScheduledEvent,它只是一个事件规则,并且可以相应地配置您的 cron 作业。还要记住授予 cloudwatch 调用 lambda 函数的权限
  • @jatinmahajan 请记住在此处对答案投赞成票或反对票。这就是我们在这里表达感激之情的方式。此外,如果某个答案符合您的目的,请将其标记为已接受,因为它也有助于其他人。
  • 一旦您的解决方案对我有用,我也会这样做。先生的努力+1。一旦我尝试这个,我会告诉你的。
  • 我们都是程序员,伙计。不,先生 :) 让我知道它是否有效。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 2017-05-18
  • 2017-11-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2022-11-03
  • 2019-12-10
相关资源
最近更新 更多