【问题标题】:serverless - not able to trigger aws lambda using cloudwatch event无服务器 - 无法使用 cloudwatch 事件触发 aws lambda
【发布时间】:2020-10-21 13:29:57
【问题描述】:

目前我的 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. 没有为我的 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 函数是否正在执行。请看下图:

【问题讨论】:

  • 但这有效吗? Lambda 控制台有时不显示触发器,即使它们有效。
  • 您是否为 cloudwatch 事件定义了 aws 权限:Type: AWS::Lambda::Permission 以调用 serverless.yaml 文件中的 lambda? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
  • @Marcin - 我点击“监控”->“在 CloudWatch 中查看日志”。但我的 lambda 函数没有看到任何“日志流”。
  • @salazarin:我附上了我的 serverless.yml 文件。我想,我没有定义任何这样的许可。您能帮我解决更新的 serverless.yml 文件或缺少的 yml 部分吗?我对 aws 很陌生。

标签: amazon-web-services serverless-framework serverless


【解决方案1】:

我尝试使用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

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

【讨论】:

  • 通过您的更改,我可以看到“EventBridge(CloudWatch Events)”链接。
  • 但是,CloudWatch 日志没有显示我的 lambda 函数的 LogStreams。
  • @Jatin 您将规则设置为每小时触发一次。可能要等 1 小时,还是你修改了?
  • 我修改为 1 分钟
  • @Marcin -- 我删除了我的 cloudformation 堆栈并重新部署。在 sls 部署之前,我还从“AWS::Lambda::Permission”中删除了“SourceAccount”。现在,lambda 工作正常。使用打印语句更新日志流。
【解决方案2】:

如果您想要做的只是让 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/

【讨论】:

  • 您好 Gareth,感谢您的快速解决方案。但是,我正在专门尝试我自己的方式来完成我的任务。您的解决方案会起作用,但我更感兴趣的是使用 cloudformation 语法提供资源信息。
  • 您可能会发现使用 SAM 比使用 SAM 更有用,因为 SAM 是 AWS 对无服务器框架的尝试,但仅使用 Cloud Formation。这样一来,您就可以避免无服务器框架完成的可能会阻碍您的工作的额外工作。
【解决方案3】:
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"

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2018-02-26
相关资源
最近更新 更多