我遇到了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:*:*"
它应该是这样的。我的问题是,当我尝试部署它时,我得到一个错误,表示该函数尚未创建,这是可以理解的。我怎样才能克服这个问题?有什么想法吗?
答案 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"