微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Every-Monday 和 Every-month cron 表达式不能正常工作

如何解决Every-Monday 和 Every-month cron 表达式不能正常工作

我使用 cloudformation 创建了一个 lambda 和 EventBridge 堆栈,我有两个 lambda 与完全相同的 cloudformation 模板和不同的 cron 表达式,一个cron(0 8 1 * ? *),每个月 8:00Am,一个cron(0 16 ? * 2 *)每个星期一下午 4:00,但我的 lambda 没有记录意味着它们还没有被执行,这里是 cloudformation template.yml:

Transform: AWS::Serverless-2016-10-31

Parameters:
  ImageUri:
    Type: String
  LambdaName: 
    Type: String
  RoleName:
    Type: String
  DatabaseHost:
    Type: String
  DatabaseUsername:
    Type: String
  DatabasePassword:
    Type: String
  DatabaseName:
    Type: String
  SQSQueueUrl:
    Type: String

  

Resources:
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Join ['/',['/aws/lambda',!Ref LambdaName]]

  ScheduledRule:
    Type: AWS::Events::Rule
    Properties:
      Description: "Montly Collision Cronjob"
      ScheduleExpression: "cron(0 8 1 * ? *)"
      State: "ENABLED"
      Targets:
        -
          Arn:
            Fn::GetAtt:
              - LambdaFunction
              - Arn
          Id: !Join
          - ''
          - - "monthly-collision-cronjob"
            - !Ref LambdaName
  
  LambdaPermission:
      Type: "AWS::Lambda::Permission"
      Properties:
          Action: "lambda:InvokeFunction"
          FunctionName: !Join
          - ''
          - - !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:"
            - !Ref LambdaName
          Principal: "events.amazonaws.com"
          SourceArn: !GetAtt ScheduledRule.Arn

  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref RoleName
      AssumeRolePolicyDocument:
        Statement:
          - Action:
            - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
              - lambda.amazonaws.com
        Version: 2012-10-17
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole # For cloudwatch logging
        - arn:aws:iam::aws:policy/AmazonSQSFullAccess

  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Ref LambdaName
      PackageType: Image
      MemorySize: 256
      Timeout: 45
      ImageUri: !Ref ImageUri
      Environment:
        Variables:
          DATABASE_HOST: !Ref DatabaseHost 
          DATABASE_USERNAME: !Ref DatabaseUsername
          DATABASE_PASSWORD: !Ref DatabasePassword
          DATABASE_NAME: !Ref DatabaseName
          SQS_QUEUE_URL: !Ref SQSQueueUrl
      Role: !GetAtt
        - LambdaRole
        - Arn

欢迎任何帮助!

解决方法

首先,为了节省代码,你可以直接使用serverless函数的Event属性:

  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Ref LambdaName
      PackageType: Image
      MemorySize: 256
      Timeout: 45
      ImageUri: !Ref ImageUri
      Environment:
        Variables:
          DATABASE_HOST: !Ref DatabaseHost 
          DATABASE_USERNAME: !Ref DatabaseUsername
          DATABASE_PASSWORD: !Ref DatabasePassword
          DATABASE_NAME: !Ref DatabaseName
          SQS_QUEUE_URL: !Ref SQSQueueUrl
      Role: !GetAtt
        - LambdaRole
        - Arn
      Events:
        EveryFirstOfTheMonth:
          Type: Schedule
          Properties:
            Schedule: cron(0 8 1 * ? *)

你的 cron 表达式看起来不错,我不确定问题是什么,但也许你可以尝试这个解决方案并且它有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。