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

AWS Serverless Application Model (SAM) -- How do I change StageName?

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

在我的 SAM 中 template.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 和端点,但有一个名为 "Stage" 的 API 网关阶段。我想将舞台名称更改为其他名称,例如 "Prod"。如何更改艺名?

这是部署后在 cloudformation 模板中定义阶段名称的位置。我希望 "StageName": "Stage" 类似于 "StageName": "Prod".

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

我无法删除 Stage StageName,但是当我使用 SAM 部署时,我在网关API 部署中设置了一个动态 StageName 使用:

Properties: StageName: !Ref "STAGE_VARIABLE"

每个环境我都有不同的堆栈,所以有一个 prod API 和一个 prod 阶段和一个 dev API dev阶段。我发现这比同一个网关的多阶段部署更容易API

要向现有 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 中存在自动生成 "Stage" 阶段的错误。要删除默认生成的 "stage" 阶段,请将您的 sam cli 升级到最新版本,并添加一个设置 openapi 版本的全局部分:

Globals:
  Api:
    OpenApiVersion: 3.0.1

有关详细信息,请参阅 https://github.com/awslabs/serverless-application-model/issues/191。这将阻止新的生成,但如果它已经部署,您将必须手动删除该阶段,因为 SAM 本质上是无状态的。