通过一次部署向 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 来解决您的问题。