AWS无服务器应用程序模型(SAM) - 如何更改StageName?

时间:2017-04-26 18:59:11

标签: amazon-web-services amazon-cloudformation

我正在使用AWS SAM(无服务器应用程序模型)创建一个带有API端点的lambda。

在我的SAM模板中.yaml我有一个带有/ user端点的getUser lambda。

template.yaml

Resources:
  GetUser:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      Handler: handler.getUser
      Timeout: 300
      Runtime: nodejs6.10
      Events:
        GetUser:
          Type: Api
          Properties:
            Path: /user
            Method: get

当我使用AWS CLI部署它时,它成功创建了lambda和端点,但API网关阶段混淆地命名为“Stage”。我想将舞台名称更改为其他内容,例如“Prod”。如何更改阶段名称?

这是在部署之后在cloudformation模板中定义阶段名称的位置。我想要“StageName”:“Stage”就像“StageName”:“Prod”。

"ServerlessRestApiDeployment": {
  "Type": "AWS::ApiGateway::Deployment",
  "Properties": {
    "RestApiId": {
      "Ref": "ServerlessRestApi"
    },
    "StageName": "Stage"
  }

2 个答案:

答案 0 :(得分:2)

我无法删除Stage StageName,但是当我使用SAM进行部署时,我使用以下方法在GatewayAPI部署中设置了动态StageName:

Properties: StageName: !Ref "STAGE_VARIABLE"

每个环境都有不同的堆栈,因此prod API包含prod阶段,dev API包含dev阶段。我发现这比同一个GatewayAPI的多阶段部署更容易

答案 1 :(得分:0)

要将另一个阶段添加到现有API,请使用原始CFT阶段资源。文件在这里:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html 使用SAM CLI时,转换会在部署之前将API修改为原始CFT,但它支持原始资源,您可以使用.Deployment后缀引用动态部署资源。您应该能够仅添加资源并通过ref内在函数引用API值。在此处查看详细信息:https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi

# assuming there is a AWS::Serverless::Api resource named Api
ProdApiStage:
    Type: AWS::ApiGateway::Stage
    Properties:
      StageName: prod
      RestApiId: !Ref Api
      DeploymentId: !Ref Api.Deployment

SAM CLI中存在一个错误,该错误会自动生成“阶段”阶段。要删除默认生成的“阶段”阶段,请将sam cli升级到最新版本,并添加一个设置openapi版本的globals部分:

Globals:
  Api:
    OpenApiVersion: 3.0.1

有关详细信息,请参见https://github.com/awslabs/serverless-application-model/issues/191。这样可以防止产生新的事件,但是如果已经部署了该阶段,则必须手动删除该阶段,因为SAM本质上是无状态的。