在无服务器中创建Lambda权限

时间:2017-01-10 14:09:06

标签: node.js aws-lambda serverless-framework

我遇到了Serverless v1.5的问题(在撰写本文时目前可用的最新版本)

我要添加lambda函数的权限,我试图通过创建CF模板并运行该函数的部署来实现这一目的:

resources:
  Resources:
    logsGroup:
      Type: "AWS::Lambda::Permission"
      Properties: 
        Action: lambda:InvokeFunction
        FunctionName: 
          Fn::GetAtt:
            - "${self:custom.${opt:stage}.name}"
            - "Arn"
        Principal: "logs.amazonaws.com"
        SourceAccount:
          Ref: "AWS::AccountId"
        SourceArn: "arn:aws:logs:${self:provider.region}:*:log-group:*:*"

它应该是这样的。我的问题是,当我尝试部署它时,我得到一个错误,表示该函数尚未创建,这是可以理解的。我怎样才能克服这个问题?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

没有足够的代码来添加评论 - 您是否尝试过将DependsOn属性添加到Lambda权限资源?在创建此权限之前,显式设置该属性将导致CloudFormation等待,直到创建Lambda Function资源。

此外,如果您还不知道在项目根目录中创建的.serverless文件夹包含无服务器使用的CloudFormation模板,这在排除意外的CloudFormation行为时会很有用。

答案 1 :(得分:1)

默认情况下,Serverless会首先创建您的自定义资源,这通常会将您的函数依赖的S3存储桶等放在那里。

最后,无服务器将所有内容转换为Cloudformation模板,您可以在.serverless目录中看到该模板。您会注意到,您的函数名称后缀为“LambdaFunction”。因此,如果您将函数命名为“Foo”,则会将其转换为“FooLambdaFunction”。通过该名称,您可以在自定义资源中引用该函数,这使得Cloudformation在创建资源之前等待该函数。

E.g。

functions:
  Foo:
    handler: functions/foo.handler
    name: foo-lambda
    description: Sample function
resources:
  Resources:
    PermissionToCallFoo:
      Type: "AWS::Lambda::Permission"
      Properties: 
        Action: lambda:InvokeFunction
        FunctionName: 
          Ref: FooLambdaFunction
        Principal: "logs.amazonaws.com"
  Outputs:
    FooArn:
      Value:
        Fn::GetAtt: 
          - FooLambdaFunction
          - Arn
      Export:
        Name: "FooArn"