Lambda集成与Lambda代理:优点和缺点

时间:2017-02-26 21:06:13

标签: aws-lambda aws-api-gateway serverless-framework

您认为在AWS API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?以下是我现在的想法:

与代理进行Lambda集成

  • Pro :可以快速制作原型和代码,而无需担心所有必需的配置细节(并重新发明一些轮子,如通用模板映射等)。
  • 专业:返回任何状态代码和自定义标头非常简单,同时还有一种通用的方式来读取请求的正文,标题,参数。
  • Con :一切都在代码中完成,因此自动生成文档会有点困难。依赖关系(标题,模型,返回的状态代码)在代码中“隐藏”。

没有代理的Lambda集成

  • Con :让进行更多更多工作来设置它,并且此配置可能会在不同资源中重复。
  • Pro :它允许用户解析lambda接收和返回的内容,以及如何将其映射到不同的HTTP状态代码,标头和有效负载。
  • Pro :非常有用,因为它预先规定了它返回的内容,以及它在标头和有效负载方面的要求。
  • Pro :设置所有内容时的艰苦工作从长远来看非常有用,因为可以将所有内容导出到Swagger,以便其他人可以使用它为其生成不同的SDK。

你有什么想法?您通常使用Lambda Proxy还是普通的Lambda集成?你喜欢什么,为什么?

编辑:到目前为止,我倾向于总是选择不使用代理功能,因为提到的原因(解耦和说明依赖关系 - 标题,状态代码等等)。< / p>

5 个答案:

答案 0 :(得分:5)

无代理。

我在生产中有几个SLS部署,有些产生了一些作为内部工具的收入。我专门不使用代理。我不想依赖AWS的结构来应用我的应用程序,所以如果我们不再成为朋友,我可以毫不费力地迁移。

至于代理人的优点,我会认为它们是缺点,因为它感觉你也有,并且作为专业人士。在“让我们快速移动”之前,我已经看到了这一切。是的,我们需要敏捷并快速行动,但不要以牺牲思维为代价。我总是和我的工程师一起得到这个,在文档/设计上还有一件事就是另外一起说“坚持规划让代码”。无论你多快进入市场,这就是你如何改变自己。没有代理(以及对项目结构进行一些早期规划,也许还有一些优秀的DDD思想),如果世界燃烧,那么从AWS迁移起来非常简单。

除此之外,我发现很难通过AWS的东西快速获得新的标准。一旦你知道它的所有肉汁,但开发人员是开发人员,而不是基础设施工程师(我们这些两者都非常罕见)。抽象离开可以帮助人们在狂欢节开始他们艰难的旅程时保持高效。我更喜欢我的编码器代码,而不是每20分钟就打扰一次CFN。

答案 1 :(得分:2)

我们也从Proxy开始,因为启动和运行许多功能确实非常快。很快我们就意识到,我们与代理强制我们读取输入和写入输出的方式建立了非常紧密的耦合,并且我们的函数对此一无所知,并且应该具有更清晰,更简单的界面。然后,我们想开始使用AWS Step Functions and that's when we realized we had created functions that really only work with the Proxy integration来协调其中一些功能。不能使用步进功能,因此它们肯定不容易迁移。

没有代理了。

答案 2 :(得分:2)

它看起来像AWS recommends choosing Lambda Proxy Integration for new API development

  

注意

     

Lambda定制集成(以前称为Lambda集成)是一项旧技术。我们建议您对任何新API使用Lambda代理集成。有关更多信息,请参阅使用Lambda代理集成构建API网关API。

我知道,使用代理集成而非自定义集成来启动API端点和lambda集成是很“快”的事情(短期内),但令我惊讶的是,这是对 all的推荐 API / Lambda开发正在进行:

  • 我将API Gateway描绘为负责处理“ HTTP详细信息”。使用代理集成可将责任(至少是其一部分)强加给Lambda函数。 (即知道如何解释和确定HTTP标头,查询参数,状态码等)
  • 这样做,我觉得它是 muddies 的后盾Lambda函数的责任-Lambda现在既要处理被调用要执行的任何“业务”逻辑,又要处理解释传入HTTP值并确定传出HTTP响应值。
  • 当然,您可以实现一个附加的Lambda函数层来抽象HTTP详细信息,但这不是API Gateway应该做什么?
  • 除了为HTTP请求提供服务外,它还会降低在上下文 中重用任何给定Lambda函数的能力,除非非HTTP客户端将请求格式化为HTTP请求。

答案 3 :(得分:2)

由于身体映射模板-代理更好。

aws api gateway body mapping template dynamodb apache velocity

我不喜欢人体贴图模板,因为在导出的Swagger中它是转义的,例如:

        uri: "arn:aws:apigateway:us-east-1:dynamodb:action/UpdateItem"
        responses:
          default:
            statusCode: "200"
        requestTemplates:
          application/json: "{\n    \"TableName\": \"happy-marketer\",\n    \"Key\"\
            : {\n        \"pk\": {\n            \"S\": \"project\"\n        },\n \
            \       \"sk\": {\n            \"S\": \"$context.authorizer.claims.email\
            \ $util.urlDecode($input.params('name'))\"\n        }\n    },\n    \"\
            UpdateExpression\": \"SET projectStatus = :c\",\n    \"ExpressionAttributeValues\"\
            : {\n        \":c\": {\n            \"S\": \"Completed\"\n\n        }\n\
            \    }\n}"
        passthroughBehavior: "never"
        httpMethod: "POST"
        type: "aws"
  /projects/{name}/status/restore:
    options:
      consumes:
      - "application/json"
      produces:
      - "application/json"
      parameters:
      - name: "name"
        in: "path"

并且您了解-在本地编辑此类“代码”并部署此swagger文件是不好的。同样,当您在浏览器中编辑身体贴图模板时,您将不会收到有关错误的JSON / Apache Velocity的错误。例如,这里我们有一个错误:

{
  "email": "$context.authorizer.claims.email",
  "nameOld": "$util.urlDecode($input.params('name'))",

  #if ($input.path('$.nameNew') != "")
  "nameNew": "$util.urlDecode($input.path('$.nameNew'))",
  #end

  #if ($input.path('$.ownerNew') != "")
  "ownerNew": "$input.path('$.ownerNew')",
  #end

  #if ($input.path('$.shared') != "")
  "shared": $input.json('$.shared')
  #end

  #if ($input.path('$.StartDate') != "")
  , "startDate": "$input.path('$.StartDate')"
  #end

  #if ($input.path('$.DueDate') != "")
  , "dueDate": "$input.path('$.DueDate')"
  #end
}

错误是-,之前的startDate错误。我在Go中的后端代码没有出现此类错误。我不想为Apache Velocity编写测试。

此外,也许代理集成速度更快-因为缺少“中间服务”。

答案 4 :(得分:0)

作为最佳实践,我个人会选择代理集成(与 proxy resource 不同)。原因如下:

  • 如果您使用代理集成,VTL 是您必须学习的另一件事。另外,你如何测试你的 VTL 逻辑?我会争辩说,这种逻辑比不商业更重要。此外,根据我的经验,调试 VTL 非常糟糕。
  • 在代码中具有 HTTP 响应映射逻辑 使其易于测试。此外,您可以使用适配器模式轻松地将 HTTP 响应映射逻辑与端点的业务逻辑分离。