代码之家  ›  专栏  ›  技术社区  ›  Emad Dehnavi

使用lambda和api getway的restapi

  •  0
  • Emad Dehnavi  · 技术社区  · 6 年前

    我开始使用lambda和api getway研究aws无服务器,所以我想为一个示例项目创建一个restapi。我注意到,在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中处理它们中的每一个?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tom    6 年前

    可以有多个api网关路由直接指向同一lambda函数。如何设置它取决于您如何维护基础设施。

    例如,如果您将cloudformation与无服务器应用程序模型(sam)结合使用,我建议您这样做,因为这可能是跟踪无服务器基础架构(和基础架构代码=awesome)的最直接的方法,您可以用一个单独的 API Gateway source event 对于在aws::serverless::api中定义的每个路由。

    大致如下:

    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函数的调用/错误/etc.度量,因此将它们分离可以很容易地看到人们注册和登录的频率,等等。
    • 更精细的警报 -您可以为不同的路由设置不同的延迟/错误/等阈值,如果警报关闭,您就确切地知道它用于哪个lambda函数。