无服务器 - 无法使用 cloudwatch 事件触发 aws lambda

serverless - not able to trigger aws lambda using cloudwatch event

目前我的 serverless.yml 文件如下所示:

service: bbb

provider:
  name: aws
  runtime: go1.x
  stage: dev

package:
  exclude:
    - ./**
  include:
    - ./bin/**
    
functions:
  ccc:
    handler: bin/executable
    name: my1minutelambda
    role: 
      'Fn::GetAtt':
        - mylambdaexecutionrole
        - Arn
            
resources:
  Resources:
    mylambdaexecutionrole:
      Type: AWS::IAM::Role
      Properties:
         RoleName: my-basiclambdaexec-role
         Description: This is my basiclambdaexecution role
         AssumeRolePolicyDocument:
           Version: "2012-10-17"
           Statement:
             -
               Effect: Allow
               Principal:
                 Service:
                     - "lambda.amazonaws.com"
               Action:
                 - "sts:AssumeRole"
         ManagedPolicyArns:
           - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
    myminschedulerevent: 
      Type: AWS::Events::Rule
      Properties:
        Description: This is my 1 minute rate scheduler.
        Name: my-1-min-trigger-event-scheduler
        ScheduleExpression: rate(1 hour) 
        Targets: 
          - 
            Arn: "arn:aws:lambda:us-east-1:111111111111:function:my1minutelambda" #update your a/c Id
            Id: "TargetFunctionV1"

用于部署的命令:sls deploy

部署完成后,我可以在aws管理控制台上看到我的所有资源都已创建。

但是我无法看到我的 lambda 函数的 cloudwatch 触发器建立

见下图:

  1. CloudWatch 事件规则创建成功。 (目标部分指向我的 lambda 函数)

  1. 触发器 link 没有为我的 lambda 建立:

请让我知道我在这里缺少什么。谢谢。

更新#1:

添加以下行后(按照 Marcin 的建议),我能够看到“CloudWatch 事件”。

EventsPermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: my1minutelambda
    Action: lambda:InvokeFunction
    Principal: events.amazonaws.com
    SourceAccount: !Ref 'AWS::AccountId'
    SourceArn: !GetAtt myminschedulerevent.Arn

但是,我看不到 CloudWatch 日志!!所以,我无法确定我的 lambda 函数是否正在执行。请看下图:

我尝试使用 serverless 框架重现问题

为此,我在您的模板末尾添加了以下 AWS::Lambda::Permission

    EventsPermission:
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: dsfgsdfg # <-- REPLACE this with your function name my1minutelambda
        Action: lambda:InvokeFunction
        Principal: events.amazonaws.com
        SourceArn: !GetAtt myminschedulrevent.Arn

添加权限后,控制台按预期显示触发器

如果您要做的只是让 Lambda 函数按计划执行,无服务器框架已经包含一个明确用于该目的的事件类型:

functions:
  crawl:
    handler: crawl
    events:
      - schedule: rate(2 hours)
      - schedule: cron(0 12 * * ? *)

它将为您设置好一切,无需添加额外的 CloudFormation。您可以在此处找到文档:https://www.serverless.com/framework/docs/providers/aws/events/schedule/#schedule/

ScheduledRule:
    Type: AWS::Events::Rule
    Properties:
      Name: "SphEvent"
      Description: "ScheduledRule"
      ScheduleExpression: "rate(1 hour)"
      State: "ENABLED"
      Targets:
        - Arn: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:lambda-name"
          Id: "TargetFunctionV1"
  PermissionForEventsToInvokeLambda:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref "LambdaFunction"
      Action: "lambda:InvokeFunction"
      Principal: "events.amazonaws.com"
      SourceArn:
        Fn::GetAtt:
          - "ScheduledRule"
          - "Arn"