【问题标题】:Versioning an API deployed with SAM对使用 SAM 部署的 API 进行版本控制
【发布时间】:2019-01-16 21:40:00
【问题描述】:

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

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。

我已经考虑过修改我的招摇以创建具有 /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 进行错误修复会很困难。我很惊讶我没有在互联网上找到任何关于使用 SAM 进行 API 版本控制(不是 Lambda 版本控制)的讨论。有处理这个的约定吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway aws-sam


    【解决方案1】:

    我认为没有约定俗成,每个人都根据自己的需要做自己的事情。

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

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

    但是,您正确地指出,将错误修复版本推送到 v1 会有问题。我建议将 v1 和 v2 拆分为独立的 Cloudformation 堆栈。似乎这可能是可行的,因为您的函数位于 API 网关后面,而且我假设 v1 的进一步开发已被冻结,除了提到的错误修复版本。

    【讨论】:

    • 单独的 CloudFormation 方法听起来不错。我必须为我的所有资源添加版本后缀,这很糟糕。 v2 API 也会有一个不同的基本 URL,这意味着我必须在前面粘贴一些东西才能正确路由 v1 和 v2 请求。你知道亚马逊是否提供类似的路由服务?
    • 有应用负载均衡器,但我不知道是否可以根据您的目的进行配置。您可以将 API 网关配置为执行基于路径的路由,因此您可以让 /v1/ 和 /v2/ 由不同的 Lambda 处理。这对你有用吗?
    • 是的,听起来我需要注册一个域名(我真的应该这样做),然后用不同的路径将 Lambda 绑定到该域。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 2014-10-29
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多