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

Я создал файл SAM template.yaml, который содержит два экземпляра API Gateway - один для производства и один для подготовки. Каждый из них имеет свой собственный этап, называемый «Производство» и «Этап», соответственно, и каждый из этих этапов имеет свои собственные переменные этапа, которые *

соответствуют среде. *1001*

Приложение, которое я создаю локально, было создано с использованием AWS SAM CLI, и я использую команду 'sam local start-api' для запуска локальных экземпляров шлюза API для проверки вызова конечных точек в почтальоне - что работало нормально. К сожалению, теперь мне нужно начать тестирование конечных точек, требующих переменных этапа, и я не вижу способа сказать SAM CLI, какой из двух экземпляров API Gateway в файле шаблона имитировать. Очевидно, что я не хочу, чтобы он использовал 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

1 Ответ

0 голосов
/ 15 февраля 2020

Для достижения этого можно использовать формирование облака, если условие https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic -функция-эталонные-условия-если .

Вот краткий пример:


# 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...