通过一次部署向 ApiGateway 授予 Lambda Invoke 权限
Give Lambda Invoke permission to ApiGateway with one deployment
我在 serverless.yml
中编写了如下资源:
resources:
Resources:
RestApi :
Type : AWS::ApiGateway::RestApi
Properties :
Body : ${file(./swagger.yaml)}
LoginApiToInvokeLambda:
Type: AWS::Lambda::Permission
Properties:
FunctionName: login
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
当我部署 sls 时,出现以下错误:
An error occurred: LoginApiToInvokeLambda - Function not found: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:api-dev-login (Service: AWSLambda; Status Code: 404; Error Code: ResourceNotFoundException
在最初的部署中,我认为权限是在创建 lambda 函数之前设置的。因此,我在serverless.yml中注释掉了LoginApiToInvokeLambda
。我又sls deploy
了,成功了。但是 ApiGateway 没有调用 lambda 的权限。之后我恢复了注释掉的部分,sls deploy
。最后,我能够向 ApiGateway 授予 Lambda 调用的权限。
有没有办法同时做到这一点?
您可以在 resources
部分使用 DependsOn
functionality of CloudFormation。
resources:
Resources:
# ...
LoginApiToInvokeLambda:
Type: AWS::Lambda::Permission
DependsOn: LoginLambdaFunction
Properties:
FunctionName: login
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
我假设你的 lambda 函数键是 login
,它被翻译成 LoginLambdaFunction
。如果没有,请查看 how the resources get named.
上的无服务器文档
简而言之,无服务器将您的配置转换为 CloudFormation 模板,资源部分允许您自定义生成的内容,这就是为什么您可以使用 DependsOn
来解决您的问题。
我在 serverless.yml
中编写了如下资源:
resources:
Resources:
RestApi :
Type : AWS::ApiGateway::RestApi
Properties :
Body : ${file(./swagger.yaml)}
LoginApiToInvokeLambda:
Type: AWS::Lambda::Permission
Properties:
FunctionName: login
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
当我部署 sls 时,出现以下错误:
An error occurred: LoginApiToInvokeLambda - Function not found: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:api-dev-login (Service: AWSLambda; Status Code: 404; Error Code: ResourceNotFoundException
在最初的部署中,我认为权限是在创建 lambda 函数之前设置的。因此,我在serverless.yml中注释掉了LoginApiToInvokeLambda
。我又sls deploy
了,成功了。但是 ApiGateway 没有调用 lambda 的权限。之后我恢复了注释掉的部分,sls deploy
。最后,我能够向 ApiGateway 授予 Lambda 调用的权限。
有没有办法同时做到这一点?
您可以在 resources
部分使用 DependsOn
functionality of CloudFormation。
resources:
Resources:
# ...
LoginApiToInvokeLambda:
Type: AWS::Lambda::Permission
DependsOn: LoginLambdaFunction
Properties:
FunctionName: login
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
我假设你的 lambda 函数键是 login
,它被翻译成 LoginLambdaFunction
。如果没有,请查看 how the resources get named.
简而言之,无服务器将您的配置转换为 CloudFormation 模板,资源部分允许您自定义生成的内容,这就是为什么您可以使用 DependsOn
来解决您的问题。