【问题标题】:Is it possible to attach multiple schedule/cron events with one AWS Lambda function?是否可以使用一个 AWS Lambda 函数附加多个计划/cron 事件?
【发布时间】:2021-04-11 23:28:25
【问题描述】:

目前,我的 lambda 函数与附加的一个计划事件一起成功运行。我的 template.yaml 的相关摘录:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
      Runtime: java11
      MemorySize: 512
      Environment:
        Variables:
          PARAM1: VALUE
      Events:
        CronHourlyEvent: # This already works
          Type: Schedule
          Properties:
            Description: Send John Doe
            Enabled: True
            Schedule: "cron(0 0/1 * * ? *)"
            Input: !Sub '{"name": "John Doe"}'

这里每隔一小时触发一次 Lambda,它工作正常。

现在我想添加另一个计划事件,该事件每天中午 12 点触发一次相同的 lambda。一种方法是创建一个单独的 lambda 并将每日计划事件附加到它,但我不想为此创建一个新的 lambda。我希望我可以将两个计划事件附加到同一个 lambda。

我在网上找不到任何将多个计划事件附加到 lambda 的示例,但我认为需要在 template.yaml 文件中添加以下内容:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
      Runtime: java11
      MemorySize: 512
      Environment:
        Variables:
          PARAM1: VALUE
      Events:
        CronHourlyEvent: # this was already present
          Type: Schedule
          Properties:
            Description: Send John Doe
            Enabled: True
            Schedule: "cron(0 0/1 * * ? *)"
            Input: !Sub '{"name": "John Doe"}'
        CronDailyEvent: # added this
          Type: Schedule
          Properties:
            Description: Send Jane Doe
            Enabled: True
            Schedule: "cron(0 12 1/1 * ? *)"
            Input: !Sub '{"name": "Jane Doe"}'

我想在本地测试,所以我下载并配置了sam-sdk。但我认为这不支持在本地运行 cron 作业。我能够手动触发事件,但找不到任何根据提供的 cron 表达式自动运行计划作业的规定。

所以我想知道:

  1. 我们是否可以将 2 个或更多计划/cron 类型的事件附加到 AWS lambda 函数?
  2. 如果是,我所做的代码更改是否正确?

这将直接投入生产,我似乎无法找到一种在本地测试它的方法。

【问题讨论】:

  • 1.是的你可以。 2. 我不确定无服务器框架,但我认为您必须为额外事件创建独立的AWS::Events::Rule 资源。
  • 另外,你在这里问是因为你不能做这些改变,因为它会直接投入生产(我什至不会开始解释为什么这个流程是错误的)但你知道你是否可以创建一个带有测试 lambda/rules 的新模板并将其部署到非 prod 以查看它是否有效?
  • 只要让规则在整点每小时触发一次 lambda,那么它会在每天中午 12 点触发吗?完全同意上面的评论,你应该有一个测试环境。
  • 虽然它是 1 个 lambda,但我不明白,所以当它自动触发时它应该做同样的事情?是因为您将为每个事件发送不同的输入,然后基于此在 lambda 中具有逻辑吗?听起来您可能应该有 2 个单独的 lambda。最好的做法是为小型单一目的执行保留 lambda,它们的启动成本很低。
  • 是的,所以从设计的角度来看,我会有 2 个不同的 lambda,唯一的目的是每天清理一次数据库。

标签: amazon-web-services aws-lambda cron serverless-framework serverless


【解决方案1】:

我正在使用类似于以下的配置,它完美地工作并满足我的需求。

Resources:
    SayHelloWorldRule:
        Type: AWS::Events::Rule
        Properties:
            Description: The rule for greeting the world
            Name: ${self:provider.stage}-say-hello-world-rule
            ScheduleExpression: 'cron(0 7 * * ? *)'
            State: ENABLED
            Targets:
                -
                  Arn:
                    !Join [ ':', [ 'arn:aws:lambda', Ref: AWS::Region, Ref: AWS::AccountId, 'function', 'HelloWorldFunction' ] ]
                  Id: "GreetTheWorldDaily"
                  Input: '{"user": "Sudo user", "message": "Hello world!!!"}'

    SayGoodbyeWorldRule:
        Type: AWS::Events::Rule
        Properties:
            Description: "It's time to say goodbye"
            Name: ${self:provider.stage}-say-goodbye-rule
            ScheduleExpression: 'cron(30 22 * * ? *)'
            State: ENABLED
            Targets:
                -
                  Arn:
                      !Join [ ':', [ 'arn:aws:lambda', Ref: AWS::Region, Ref: AWS::AccountId, 'function', 'HelloWorldFunction' ] ]
                  Id: "SayGoodbyeDaily"
                  Input: '{"user": "Sudo user", "message": "Auf Wiedersehen!!!"}'

    PermissionForEventsToInvokeHelloWorldLambda:
        Type: AWS::Lambda::Permission
        Properties:
            FunctionName: HelloWorldFunction
            Action: "lambda:InvokeFunction"
            Principal: "events.amazonaws.com"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2019-01-09
    • 2018-07-14
    • 2018-06-15
    • 1970-01-01
    • 2021-01-13
    • 2020-02-13
    • 2015-10-21
    相关资源
    最近更新 更多