При создании нескольких экземпляров шлюза API в template.yaml, как вы контролируете, какой шлюз имитируется при запуске sam local start-api?

Я создал файл SAM template.yaml, содержащий два экземпляра API Gateway - один для производства, а другой - для промежуточного использования. Каждый из них имеет свой собственный этап, называемый соответственно производственным и промежуточным, и каждый из этих этапов имеет свои собственные переменные этапа, которые зависят от среды.

Приложение, которое я создаю локально, было создано с использованием 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

person Nic Holmes    schedule 11.02.2020    source источник


Ответы (1)


Вы можете использовать формирование облака, если условие 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.

person me2resh    schedule 15.02.2020
comment
О, замечательно, я немного читал о параметрах, но не понимал, что их можно использовать таким образом. Спасибо! - person Nic Holmes; 19.02.2020