使用 Lambda 和 API 网关休息 API

Rest API using Lambda and API Getway

我开始使用 lambda 和 API Getway 研究 AWS 无服务器,所以我想为示例项目创建一个 REST API。我注意到在 API Getway 中,我们只能创建可以触发 lambda 函数的 http 方法,所以我不确定我是否做对了,但是,每个 api 我们是否需要一个 lambda 函数路线?或者我们可以使用一个 lambda 函数以某种方式处理它。

例如,假设我的项目需要 api 用于以下列表:

那么如果我要使用 API Getway 和 Lambda 来实现,我需要 3 个 Lambda 函数吗?

如果我想为上面提到的那些创建 API,端点应该是这样的吗?

https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_LOGIN
https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_REGISTER
https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_GET_USER_DATA

有没有办法将多个 http 请求发送到一个 lambda 函数,并在 lambda 中处理每个请求?

可以有多个 API 网关路由指向同一个 Lambda 函数。如何设置取决于您维护基础设施的方式。

例如,如果您将 CloudFormation 与无服务器应用程序模型 (SAM) 结合使用,我推荐这样做,因为它可能是跟踪无服务器基础设施(以及基础设施即代码 = 很棒)的最直接方式,您会为您在 AWS::Serverless::Api.

中定义的每条路线使用单独的 API Gateway source event 定义您的 AWS::Serverless::Function

类似于以下内容:

YourApi:
  Type: AWS::Serverless::Api
  Properties:
    ...
    DefinitionBody:
      swagger: 2.0
      ...
      paths:
        '/Login':
          post:
            x-amazon-apigateway-integration:
              # APIG->Lambda requests are always POST
              httpMethod: post
              type: aws_proxy
              uri:
                Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations
        '/Register':
          post:
            x-amazon-apigateway-integration:
              # APIG->Lambda requests are always POST
              httpMethod: post
              type: aws_proxy
              uri:
                Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations
        '/GetUserData':
          get:
            x-amazon-apigateway-integration:
              # APIG->Lambda requests are always POST
              httpMethod: post
              type: aws_proxy
              uri:
                Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations

YourLambda:
  Type: AWS::Serverless::Function
  Properties:
    ...
    Events:
      login:
        Type: Api
        Properties:
          Path: '/Login'
          Method: post
          RestApiId: {Ref: YourApi}
      register:
        Type: Api
        Properties:
          Path: '/Register'
          Method: post
          RestApiId: {Ref: YourApi}
      getUserData:
        Type: Api
        Properties:
          Path: '/GetUserData'
          Method: get
          RestApiId: {Ref: YourApi}

不过请记住,将路由整合到一个 Lambda 函数中有利也有弊。 探讨了这一点,但我想为分离的 Lambda 函数添​​加更多好处:

  • 关于您的路线被调用频率的更清晰指标 - 您得到 invocations/errors/etc。 CloudWatch 中针对每个开箱即用的 Lambda 函数的指标,因此将它们分开可以很容易地了解人们注册与登录的频率等。
  • 更精细的警报 - 您可以设置不同的 latency/error/etc。不同路线的阈值,如果警报响起,您确切知道它适用于哪个 Lambda 函数。