在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名

Posted

技术标签:

【中文标题】在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名【英文标题】:Specify multiple API stages and Lambda Aliases in SAM template defining a single AWS::Serverless::Function 【发布时间】:2021-04-19 19:24:36 【问题描述】:

我的目标 我正在尝试编写一个(单个)SAM 模板来获取由 Api Gateway 事件触发的 Lambda 函数。

我想要拥有多个 API 阶段(例如“dev”、“testing”、“prod”),并且我希望将它们中的每一个都映射到具有相同名称的 Lambda 别名。

我不希望在每次部署时都生成新的 lambda 版本,我喜欢手动设置每个 lambda 别名使用的 lambda 版本。当然,“dev”别名意味着指向 $LATEST 代码版本。

我尝试了什么,我得到了什么

我将经典的“hello_world”模板修改如下。 现在,当第一次部署(比如,到“开发”)时,一切似乎都按预期工作。 但是如果我尝试部署到“测试”阶段,新阶段的 API 会响应,而“开发”阶段的 API 会停止响应。

我错过了什么?

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  zzzz

  Sample SAM Template for zzzz

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Parameters:
  StageAliasName:
    Description: stage / alias name to be used in this deploy
    Type: String
    AllowedValues:
      - prod
      - stage
      - dev
      - v1
    Default: dev

Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: !Ref StageAliasName

  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      AutoPublishAlias: !Ref StageAliasName
      FunctionName: zzz
      Environment:
        Variables:
          stage: !Ref StageAliasName
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            RestApiId: !Ref ApiGatewayApi
            Path: /hello
            Method: GET
#            Auth:
#              ApiKeyRequired: true



Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
#  HelloWorldApi:
#    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
#    Value: !Sub "https://$ServerlessRestApi.execute-api.$AWS::Region.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

【问题讨论】:

您好,您是否找到了无需使用其他工具即可解决此问题的解决方案? 嗨,还没有。将删除策略设置为“保留”可能有效,但我还没有尝试过。 我觉得很遗憾没有明显的解决方案。到目前为止,我想我只是复制堆栈并将堆栈名称作为参数传递以选择 dev 或 prod。 【参考方案1】:

我和你有同样的问题,发现了这个:https://jun711.github.io/aws/deploy-api-gateway-to-multiple-stage-when-aws-sam-replaces-previous-stages/。 SAM 似乎取代了之前的阶段。

这个 jun chap 做了一些手动步骤来使它工作。很高兴知道它可以工作,但是有点破坏“基础设施即代码”我认为我将使用 ansible 为不同环境模板化不同版本的模板,然后就运行它。

【讨论】:

感谢@ident 的回复。我知道如何使用其他工具来做到这一点,但我认为必须有一种方法可以在模板中定义这一切:这就是我要寻找的。​​span> 我认为一个人可以做你想做的事,但求助于普通的 Cloudformation,这对我来说似乎是解决方案:***.com/a/58725869/6398014 谢谢@CodigoMorsa 您认为将删除策略设置为“保留”可能会有所帮助吗?

以上是关于在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名的主要内容,如果未能解决你的问题,请参考以下文章

Azure devops - 从单个版本定义运行多个版本

获取自定义帖子类型中单个帖子的类别

MFC 单个SetTimer怎么用啊

php 在单个帖子#wordpress上显示自定义类别

在单个自定义帖子类型中显示所选类别(Wordpress)

多个字体到单个自定义 TextView