Amazon web services 来自CloudWatch规则的AWS SAM Lambda函数触发器

Amazon web services 来自CloudWatch规则的AWS SAM Lambda函数触发器,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我有一个Lambda和一个触发Lambda的CloudWatch规则。当我通过web控制台设置这些时,我可以在Lambda控制台中看到它的触发器实际上是CloudWatch规则 现在我想从AWS SAM YAML模板设置它,触发器确实按照预期创建,但在lambda web控制台中,它没有将CloudWatch规则显示为触发器 另外,我需要在YAML中设置lambda的VPC,但对lambda没有影响 如果有人能看看YAML并为我指出正确的方向,我将不胜感激: Resources: checkN

我有一个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没有帮助

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

您必须将
Fn::GetAtt
与定义的无服务器函数的逻辑ID一起使用,以获取ARN

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

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

您必须将
Fn::GetAtt
与定义的无服务器函数的逻辑ID一起使用,以获取ARN

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

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

  • Lambda函数
  • 事件规则
  • 向事件授予Lambda调用权限
下面这样的东西不见了

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


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

  • Lambda函数
  • 事件规则
  • 向事件授予Lambda调用权限
下面这样的东西不见了

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


我最近做过这件事。您不应该在函数上设置事件,只需删除函数上的整个
Events
部分。您只需要3个资源:
AWS::Serverless::Function
AWS::Events::Rule
(根据下面的答案使用
!GetAtt
),以及一个
AWS::Lambda::Permission
来授予规则访问权以调用您的函数。@404我们不需要AWS::Events::Rule。相反,我们可以在Serverless::Function资源中使用事件。这将在部署模板时创建事件规则。细节:我最近做过这件事。您不应该在函数上设置事件,只需删除函数上的整个
Events
部分。您只需要3个资源:
AWS::Serverless::Function
AWS::Events::Rule
(根据下面的答案使用
!GetAtt
),以及一个
AWS::Lambda::Permission
来授予规则访问权以调用您的函数。@404我们不需要AWS::Events::Rule。相反,我们可以在Serverless::Function资源中使用事件。这将在部署模板时创建事件规则。详细信息:嗨,Lambda是堆栈的一部分,因此每个堆栈部署后的名称不同。嗨,Lambda是堆栈的一部分,因此每个堆栈部署后的名称不同。