【问题标题】:Providing multiple api versions on API Gateway and Lambda using Serverlesss Framework使用无服务器框架在 API Gateway 和 Lambda 上提供多个 api 版本
【发布时间】:2018-10-02 10:33:47
【问题描述】:

我正在使用 API Gateway 和 Lambda(无服务器框架)构建一个无服务器应用程序,并试图找到一种方法来提供我们应用程序 API 的多个版本。

这是我能想到的方法。

serverless.yml

 handler: list.handler
 events:
     - http:
         path: {ver}/list
         method: get
         cors: true
         authorizer: aws_iam

list.js

 export async function handler(event, context, callback) {
     const ver = event.pathParameters.ver;
     if (ver >= '1.0') {
         return fooUtil.getNo(ver);
     } else {
         return 1;
     }  
 }

fooUtil.js

 export function getNo(ver) {
     if (ver >= 1.3) {
         return 3;
     } else {
         return 2;
     }
 }

但是,我需要以这种方式将“ver”参数传递给所有函数。

有什么方法更容易(并且可测试)从请求中获取版本号,如下所示?

fooUtil.js

 export function getNo() {
     if (session.getValue('ver') >= 1.3) {
     }
 }

我不喜欢划分存储库或 git 分支来管理多个版本。

【问题讨论】:

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


    【解决方案1】:

    每个版本将拥有自己的资源并通过文件夹将其分开?

    像这样

     handler: v1.list.handler
     events:
         - http:
             path: v1/list
             method: get
             cors: true
             authorizer: aws_iam
    
     handler: v2.list.handler
     events:
         - http:
             path: v2/list
             method: get
             cors: true
             authorizer: aws_iam
    

    这使您可以灵活地测试所有内容,并且对于项目的新手来说更容易,因为版本控制通过文件夹分离是明确的。

    【讨论】:

    • 我同意这是清晰且可测试的,但是当我们有 10 个版本(主要或次要)和每个版本 100 个方法时,将有 1000 个资源。我认为手动管理资源会很困难。我们希望在不关心添加版本的麻烦的情况下进行小的改进(次要版本)。
    • @rhythm 我建议维护可能看起来更复杂,但是当您有 10 个版本时,除非绝对必要,否则您不希望向后移植错误修复,而当您这样做时,应该就是这样——故意向后移植。过多的混合会导致倒退。版本发布后,应尽量少触动。
    【解决方案2】:

    在阅读了许多资料并试图了解 AWS API Gateway 的工作原理(从版本控制的角度)之后,我决定在我的主要版本上简单地复制 API,并通过差异分支跟踪它们。好处:

    • 更新/删除每个版本而不影响任何其他版本。例如:如果我在 V4 上并想在 V1 上进行更改,我只需切换分支,进行更改,然后推送代码。
    • 版本控制可能不仅仅在 Lambda 级别。它可能有代理,也可能对其结构进行更改。
    • 这将有助于部署过程,因为客户端可以逐步迁移到新版本,但仍然可以访问旧版本。
    • 这将有助于跟踪每个版本的历史记录。
    • 我将为我的 CI/CD 设置一个隔离流。
    • 每个版本都有一个新域。 v1.maindomain.com/api, v2.maindomain.com/api
    • 任何级别的开发人员都易于理解和维护。
    • 要创建新版本,我只需创建一个新分支并在配置文件中更新版本即可。

    我正在使用 serverless-custom-domain,它在我的部署过程中创建了一个记录集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2019-06-22
      • 2020-07-10
      • 2019-12-12
      相关资源
      最近更新 更多