【问题标题】:how can I use lambda versions and aliases to version my API with CloudFormation?如何使用 lambda 版本和别名来使用 CloudFormation 对我的 API 进行版本控制?
【发布时间】: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


    【解决方案1】:

    您可以使用来自documentationAWS::Lambda::Version 资源:

    从当前代码和功能配置创建一个版本。使用版本来创建功能代码和配置不变的快照。

    LambdaVersion:
      Type: AWS::Lambda::Version
        Properties: 
          FunctionName: !Ref ApiFunction
          Description: v1
    

    Description 属性由于不接受更新而得到修复的地方。此外,您可以为这些版本创建一些别名,例如devstageprod。例如,对于dev 版本,这将是

    DevAlias: 
      Type: AWS::Lambda::Alias 
      Properties: 
        Description: Dev Alias for Lambda function 
        FunctionName: !Ref ApiFunction
        FunctionVersion: !GetAtt LambdaVersion.Version
        Name: DEV 
    

    【讨论】:

    • 谢谢米格尔。这种方法的问题在于,当我在模板中添加 lambda 版本时,它会创建一个版本,但不会再为后续构建创建任何版本。我尝试将内部版本号放在版本描述中,以便每次强制更新版本,但失败了(文档确实说不支持更新)。
    • @mdarwin,也许用Description: v2 写一个新的AWS::Lambda::Version,但这对于以后的每次更新来说真的很麻烦。
    • 试过是动态描述值,后续版本创建失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2018-09-26
    • 1970-01-01
    • 2020-03-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多