在template.yaml中创建多个API Gateway实例时,如何控制在运行 'sam local start-api'时模仿哪个Gateway?

When creating multiple API Gateway instances in template.yaml, how do you control which Gateway is imitated when running 'sam local start-api'?

我创建了一个 SAM template.yaml 文件,其中包含两个 API 网关实例 - 一个用于生产,一个用于暂存。每个阶段都有自己的阶段,分别称为 Production 和 Staging,每个阶段都有自己特定于环境的阶段变量。

我在本地构建的应用程序是使用 AWS SAM CLI 创建的,我一直在使用命令 'sam local start-api' 到 运行 API 网关的本地实例在邮递员中测试调用端点 - 一直运行良好。不幸的是,我现在需要开始测试需要阶段变量的端点,而且我看不到任何方式告诉 SAM CLI 模仿模板文件中的两个 API 网关实例中的哪一个。显然我不希望它使用 Production 因为它将有连接到实时服务的数据。

我知道我可以创建一个包含两个阶段的 API 网关实例,因此,如果没有办法执行上述操作,是否有办法获取SAM 改为使用 API 网关实例中的特定阶段?下面是我的模板文件中的一个片段。

ApiProduction:
    Type: AWS::Serverless::Api
    Properties:
      Name: service-layer-production-v1
      StageName: Production
      OpenApiVersion: 3.0.1
      Auth:
        ApiKeyRequired: true
      Variables:
        IS_STAGING: false
        VARIABLE2: value-a
        VARIABLE3: value-a
      Models:
        Error:
          $schema: http://json-schema.org/draft-04/schema#
          title: Error Schema
          type: object
          properties:
            message:
              type: string
        Empty:
          $schema: http://json-schema.org/draft-04/schema#
          title: Empty Schema
          type: object
          properties:
            message:
              type: string

  ApiStaging:
    Type: AWS::Serverless::Api
    Properties:
      Name: service-layer-staging-vnull
      StageName: Staging
      OpenApiVersion: 3.0.1
      Auth:
        ApiKeyRequired: true
      Variables:
        IS_STAGING: true
        VARIABLE2: value-b
        VARIABLE3: value-b
      Models:
        Error:
          $schema: http://json-schema.org/draft-04/schema#
          title: Error Schema
          type: object
          properties:
            message:
              type: string
        Empty:
          $schema: http://json-schema.org/draft-04/schema#
          title: Empty Schema
          type: object
          properties:
            message:
              type: string

如果条件 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if 可以使用云形成来实现。

这是一个简单的例子:


# Set expected parameter to be passed to sam local
Parameters:
  Stage:
    Type: String
    Default: staging
    Description: Parameter for getting the deployment stage

# Create a condition based on the parameter
Conditions:
  isStagingEnvironment: !Equals
    - Ref: Stage
    - staging

Resources:

  MyFunction:
    Type: "AWS::Serverless::Function"
    Properties:
      Events:
        CatchAll:
          Type: Api
          Properties:
            Method: GET
            Path: /my-sample-function
            # If condition to switch which API to use for this event while invoking the function
            RestApiId: !If
              - isStagingEnvironment
              - !Ref ApiStaging
              - !Ref ApiProduction

然后你可以这样运行你本地的sam:

sam local start-api --parameter-overrides Stage=staging

如果每个 API 网关有多个阶段,则可以使用相同的技术。