【发布时间】:2021-01-02 12:43:03
【问题描述】:
我们有一个需要版本控制的 API。我们在 AWS 上使用 API Gateway 和 Lambda。所有代码均使用 CICD 部署,我们在 CloudFormation 之上使用 SAM 模板。
注意,我们使用 API Gateway 阶段来处理不同的环境(例如,阶段“dev1”指向 lambda“dev1-MyService”。
我们有一个资源“v1”定义如下:
V1Resource:
Type: AWS::ApiGateway::Resource
Properties:
RestApiId: !Ref Api
ParentId: !GetAtt Api.RootResourceId
PathPart: 'v1'
# proxy traffic to a lambda:
ProxyMethod:
Type: AWS::ApiGateway::Method
Properties:
HttpMethod: ANY
...
Integration:
Type: AWS_PROXY
Uri: arn:aws:apigateway:...:function:MyFunction:v1/invocations'
还有一个像这样定义的 lambda:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
AutoPublishAlias: "v1"
FunctionName: MyFunction
...
我们想要做的是在系统中保留 v1 lambda,但是当我们对 API 进行重大更改时,我们可以定义一个 /v2/ 资源,指向 lambda 的 v2 别名
我的计划是定义第二个资源 (V2Resource) 和第二个代理方法,引用 lambda 的 v2 别名,我可以通过在同一更改中将 AutoPublishAlias 碰撞到 v2 来创建它。
然后 v2 别名仍然指向旧版本(理论上永远),并且每次我们从那时起部署时,最新版本的 API 都将别名为 v2(直到我们需要进行另一个重大更改并引入 v3) .
不幸的是,当我这样做时,它会删除旧别名 v1。
那么我应该如何使用 Lambda 别名通过 API Gateway 进行 API 版本控制?使用 CloudFormation 和 SAM 模板?
【问题讨论】:
标签: amazon-web-services aws-lambda aws-api-gateway api-design api-versioning