对使用 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 的进一步开发已经冻结。
我已经使用 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 的进一步开发已经冻结。