3

我正在使用此配置部署到“产品”阶段:

"ApiGatewayApi":
  {
    "Type": "AWS::Serverless::Api",
    "Properties": {
      "StageName": "Prod",
      "Name" : "MainGateway",
       ...

我想将不同的代码部署到“阶段”阶段。我试图将“StageName”更改为“Stage”,但出现此错误:“Stage 已存在”。

如何将不同的代码部署到不同的阶段?

4

1 回答 1

3

该解决方案基于 YAML 格式,同样可以用于 JSON 格式。

StageName每当您创建其创建默认值Stage以及您提供的阶段名称时,SAM 中都会存在一个错误Prod。首先,您删除当前的,然后您可以应用此更改。

要解决此问题,有两种方法可以添加OpenApiVersion: '2.0'YAML 文件:

方法1:在下面的属性下StageName可以添加这个。可以为AWS::Serverless::Api其他资源(如AWS::Serverless::Lambda.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM template with a simple API definition
Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: 'V1'
      OpenApiVersion: '2.0'
  ApiFunction: # Adds a GET api endpoint at "/" to the ApiGatewayApi via an Api event
    Type: AWS::Serverless::Function
    Properties:
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
            RestApiId:
              Ref: ApiGatewayApi
      Runtime: python3.7
      Handler: index.handler
      InlineCode: |
        def handler(event, context):
            return {'body': 'Hello World!', 'statusCode': 200}

方法 2:您的 SAM 模板在顶层的以下内容,并确保您已在 AWS::Serverless:Api 资源上使用“StageName”定义了一个阶段。如果您有多个资源,如 API 或 lambda 等,这将是全局级别的。

Globals:
  Api:
    OpenApiVersion: 3.0.1
    Cors: '*'

Resources:
  ImplicitApiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://sam-demo-bucket/member_portal.zip
      Handler: index.gethtml
      Runtime: nodejs12.x
      Events:
        GetHtml:
          Type: Api
          Properties:
            Path: /
            Method: get
  ExplicitApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod

注意:此解决方案仅适用于从头开始创建 API 的情况。如果之前创建了 API,并且用户将 OpenApiVersion: '2.0' 添加到其中,它不会删除“Stage”阶段。它需要从头开始添加。 AWS::Serverless::Api是一个非常简单的实现,不能在 SAM 下管理多阶段,更好地使用AWS::ApiGateway::RestApi和多个AWS::ApiGateway::Stage引用 RestApi 资源。

参考

于 2021-05-26T10:50:19.583 回答