7

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

这是我能想到的方法。

无服务器.yml

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

列表.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 分支来管理多个版本。

4

2 回答 2

2

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

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

我正在使用无服务器自定义域,它在我的部署过程中创建了一个记录集。

于 2018-11-15T02:45:03.853 回答
2

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

像这样

 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

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

于 2018-04-22T08:34:10.283 回答