【问题标题】:Rest API using Lambda and API Getway使用 Lambda 和 API Gateway 的 Rest API
【发布时间】:2018-11-25 20:11:49
【问题描述】:

我开始使用 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 中处理它们中的每一个?

【问题讨论】:

  • 同意丹尼斯.. 你可以,但你为什么要这样做?单独的 lambdas 有助于在您的 lambdas 之间分离和委派责任。
  • @DenisTsoi 但是我怎样才能检测到它,比如这个调用是用于登录,还是用于注册等。我的意思是端点结构是这样的:API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION 有没有办法添加一些东西喜欢到它的路线,比如API_GETWAY_DOMAIN/STAGE/LOGIN/LAMBDA_FUNCTION
  • @James 可能我弄错了,我想从路由的角度来看这个,所以基本上,每条路由,都是一个 lambda 函数,对吧?
  • 你如何构建你的 lambdas 和你的路由是完全解耦的。
  • 也许我不明白你在做什么。您添加资源,然后将特定资源映射到“操作”,例如 lambda 函数。我不会有两个资源或路径映射到同一个函数。它使事情变得混乱,并在您的应用程序中增加了 API Gateway 可以自行完成的另一层复杂性。

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


【解决方案1】:

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

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

类似于以下内容:

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 函数中有利有弊。 This StackOverflow question/answer 对此进行了探索,但我想为分离的 Lambda 函数添​​加更多好处:

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

【讨论】:

  • 感谢汤姆,您的回答帮助我更好地理解了整个过程。
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多