通过一次部署将Lambda Invoke权限授予ApiGateway

时间:2019-03-08 17:46:22

标签: amazon-web-services aws-api-gateway serverless-framework serverless

我在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部署时,发生以下错误:

  

发生错误:LoginApiToInvokeLambda-找不到函数:arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:api-dev-login(服务:AWSLambda;状态代码:404;错误代码:ResourceNotFoundException

在初始部署中,我认为在创建lambda函数之前已设置权限。因此,我在serverless.yml中注释了LoginApiToInvokeLambda。我再次sls deploy成功了。但是ApiGateway没有调用lambda的权限。之后,我恢复了注释掉的部分和sls deploy。最终,我能够授予ApiGateway Lambda调用权限。

有没有办法同时做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以在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解决问题的原因。