首页 > 解决方案 > 使用 Lambda 和 API Getway 的 Rest API

问题描述

我开始使用 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

有没有办法向一个 lambda 函数发送多个 http 请求,并在 lambda 中处理它们中的每一个?

标签: amazon-web-servicesaws-lambdaaws-api-gatewayserverlessaws-serverless

解决方案


可以有多个 API Gateway 路由直接指向同一个 Lambda 函数。如何设置取决于您维护基础架构的方式。

例如,如果您将 CloudFormation 与无服务器应用程序模型 (SAM) 一起使用,我建议您这样做,因为它可能是跟踪无服务器基础设施(以及基础设施即代码 = 真棒)最直接的方法,您将定义您的 AWS:: Serverless::Function 为您在 AWS::Serverless::Api 中定义的每个路由提供单独的API Gateway 源事件

类似于以下内容:

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 函数中有利有弊。这个 StackOverflow 问题/答案探讨了这一点,但我想为分离的 Lambda 函数添​​加更多好处:

  • 关于路由被调用频率的更清晰的指标- 你会得到调用/错误/等。CloudWatch 中每个 Lambda 函数开箱即用的指标,因此将它们分开可以很容易地查看人们注册和登录的频率等。
  • 更精细的警报- 您可以设置不同的延迟/错误/等。不同路由的阈值,如果警报响起,您就可以确切地知道它用于哪个 Lambda 函数。

推荐阅读