【问题标题】:AWS SAM Lambda function trigger from CloudWatch Rule来自 CloudWatch 规则的 AWS SAM Lambda 函数触发器
【发布时间】:2019-11-26 08:57:54
【问题描述】:

我有一个 Lambda 和一个触发 lambda 的 CloudWatch 规则。当我通过 Web 控制台设置这些时,我可以在 Lambda 控制台中看到它的触发器确实是 CloudWatch 规则。

现在我想从 AWS SAM YAML 模板设置它,并且触发器确实按预期创建,但在 lambda Web 控制台中,它没有将 CloudWatch 规则显示为触发器。

另外,我需要在 YAML 中设置 lambda 的 VPC,但是对 lambda 没有任何影响。

如果有人可以查看 YAML 并指出正确的方向,我会很高兴:

Resources:

checkNoSessionLambda:
    Type: AWS::Serverless::Function
    Properties:
        Description: 'checkNoSessionLambda at every 1 minute'
        Handler: checkNoSessionLambda.handler
        Runtime: nodejs8.10
        Timeout: 60
        CodeUri: ./src
        Role: ***   
    VpcConfig:
        SecurityGroupIds:
            - "***"
        SubnetIds:
            - "***"
            - "***"
    Events:
        CheckNoSessionClouadwatchRule:
            Properties:
                    EventPattern: 
                        source: 
                            - "aws.events"
            Type: AWS::Events::Rule




CheckNoSessionClouadwatchRule:
    Type: AWS::Events::Rule
    Properties:
        Description: "Invoke checkNoSession lambda every 1 minute"
        ScheduleExpression: "rate(1 minute)"
        State: "ENABLED"
        Targets:                    
            -
                Arn: "***"
                Id: "checkNoSessionLambdaTargetId"

编辑:

Lambad 位于堆栈中,因此仅使用 GetAtt 无济于事

【问题讨论】:

  • 我最近做了这个。您不应该在函数上设置事件,只需删除函数上的整个 Events 部分。您只需要 3 个资源:AWS::Serverless::FunctionAWS::Events::Rule(按照下面的答案使用!GetAtt)和AWS::Lambda::Permission 授予规则访问权限以调用您的函数。
  • @404 我们不需要 AWS::Events::Rule。相反,我们可以在 Serverless::Function 资源中使用事件。这将在部署模板时创建一个事件规则。详情:github.com/awslabs/serverless-application-model/blob/master/…

标签: amazon-web-services aws-lambda


【解决方案1】:

您需要允许 cloudwatch 调用 lambda 函数,签入doc。通常的流程是

  • Lambda 函数
  • 事件规则
  • 向事件授予 Lambda 调用权限

下面的东西不见了!

  Type: AWS::Lambda::Permission
  Properties: 
    FunctionName: 
      Ref: "checkNoSessionLambda"
    Action: "lambda:InvokeFunction"
    Principal: "events.amazonaws.com"
    SourceArn: 
      Fn::GetAtt: 
        - "CheckNoSessionClouadwatchRule"
        - "Arn"

【讨论】:

    【解决方案2】:

    您是否对 ARN 进行硬编码?这将不起作用,因为您打算指向的资源(lambda 函数)尚不存在,并且将由 CFN 模板本身创建。

    您必须使用 intrinsic function Fn::GetAtt 和定义的无服务器函数的逻辑 ID 来获取 ARN。

    Targets:                    
            -
                Arn: !GetAtt checkNoSessionLambda.Arn
                Id: "checkNoSessionLambdaTargetId"
    

    【讨论】:

    • 您好,Lambda 是堆栈的一部分,因此每个堆栈部署后的名称都不同。
    猜你喜欢
    • 2017-11-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多