对使用 SAM 部署的 API 进行版本控制

Versioning an API deployed with SAM

我已经使用 SAM 部署了 API 的 v1。堆栈是 API Gateway、Lambda 和 DynamoDB table。

Lambda 函数通过 AutoPublishAlias 属性 进行版本控制。别名是 "Live"。每次我部署 v1 的新版本时,我都会得到一个新的 Lambda 版本并且 "Live" 别名更改为指向新版本,例如:

发布前:

Lambda version:
              3 <--- Alias: Live <--- v1 API
              2
              1

发布后:

Lambda version:
              4 <--- Alias: Live <--- v1 API
              3
              2
              1

现在我想部署 v2 但保持 v1 部署。

我考虑过修改 swagger 以创建具有 /v1 和 /v2 基本路径的路径的方法。我还会创建一个指向 v1 的最新版本的 "v1" 别名,并将该别名用于 /v1 API,例如:

Lambda version:
              5 <--- Alias: Live <--- v2 API
              4 <--- Alias: v1   <--- v1 API
              3
              2
              1

然后 AutoPublishAlias 将继续在每个新版本上移动 "Live" 别名,但 "v1" 别名将保留在原处,例如:

新 v2 版本

Lambda version:
              6 <--- Alias: Live <--- v2 API
              5
              4 <--- Alias: v1   <--- v1 API
              3
              2
              1

除了很难修复 v1 的错误外,这似乎是合理的。令我惊讶的是,我没有在 Internet 上找到关于使用 SAM 进行 API 版本控制(不是 Lambda 版本控制)的任何讨论。是否有处理此问题的约定?

我觉得没有什么约定俗成的,大家各取所需。

您可以做的一件事是将 Lambda Alias 资源添加到您的 SAM 模板并手动将 v1 固定到您的函数的版本 4:

MyLambdaV1Version:
  Type: AWS::Lambda::Alias
  Properties:
    FunctionName: !Ref MyLambda
    FunctionVersion: 4
    Name: v1

但是,您正确地指出将错误修复版本推送到 v1 会出现问题。我建议将 v1 和 v2 拆分为独立的 Cloudformation 堆栈。看起来它可能是可行的,因为你的功能在 API 网关后面,而且我假设,除了提到的错误修复版本之外,v1 的进一步开发已经冻结。