CloudWatch Rule的AWS SAM Lambda函数触发器

时间:2019-11-26 08:57:54

标签: amazon-web-services aws-lambda

我有一个Lambda和一个触发lambda的CloudWatch Rule。当我通过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并没有帮助

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您需要允许cloudwatch调用lambda函数,签入doc。常规流量为

  • Lambda函数
  • 事件规则
  • Grant Lambda调用事件权限

缺少以下内容!

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