Как удалить сцену из URL для функций AWS Lambda + безсерверная платформа?

Я использую Serverless Framework для развертывания функций в AWS Lambda, но не могу найти, где и как я могу удалить спецификатор этапа из созданных конечных точек URL. Документация не покрывает эту часть.

Например, это мой serverless.yml (без учета не относящихся к делу частей):

service: cd-mock
provider:
  name: aws
  runtime: python3.6
  region: eu-west-1
package:
  include:
    - handler.py
functions:
  index:
    handler: handler.index
    events:
      - http:
          path: /
          method: get

После serverless deploy, возвращается следующая служебная информация:

service: cd-mock
stage: dev
region: eu-west-1
stack: cd-mock-dev
api keys:
  None
endpoints:
  GET - https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/
functions:
  index: cd-mock-dev-index

Обратите внимание на /dev часть в конечной точке URL, а также в функции. Тот dev значение по умолчанию для stage параметр в файле конфигурации.

Определение stage: something в serverless.yml файл будет иметь это /something как суффикс в URL, и как часть функции.

Вопрос: как я могу удалить спецификацию этапа из сгенерированных конечных точек URL-адреса или: как я могу предотвратить включение этой спецификации этапа в составные URL-адреса?

(То, что сцена является частью функции, это хорошо. Это будет легко отделить staging а также production функции в панели управления AWS Lambda.)

5 ответов

Решение

Это функция / соглашение API Gateway НЕ от Serverless Framework, поэтому serverless ничего не могу с этим поделать.

API-шлюз требует от вас стадии, и он добавляется в конце вашей конечной точки.

Конечные точки API Gateway предназначены для разработчиков, хотя и не должны быть удобными для пользователя.

Если вы хотите, чтобы он был удобным для пользователя, вы можете добавить собственный домен для него. Различные этапы могут иметь разные настраиваемые поддомены.

Вы можете использовать собственный домен, которым владеете (например, mycompany.com) и сопоставьте его со своим API-шлюзом. Таким образом, вместо того, чтобы делать запросhttps://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/, вы бы сделали запрос https://api.mycompany.com/.

Есть плагин под названием serverless-domain-manager это значительно упрощает настройку пользовательских доменов. Ознакомьтесь с этим сообщением в блоге, чтобы узнать, как его использовать.

В локальной среде мы можем использовать флаг --noPrependStageInUrl при запуске сервера разработки: sls offline start --noPrependStageInUrlпри использовании без сервера в автономном режиме. В режиме онлайн мы можем создать CloudFront или собственный домен.

Это можно решить, используя httpApiвместо. Вместо того

      functions:
  index:
    handler: handler.index
    events:
      - http:
          path: /
          method: get

использовать этот

      functions:
  index:
    handler: handler.index
    events:
      - httpApi:
          path: /
          method: get

Если вы не полагаетесь на протокол REST, который используется с httpи протокол HTTP вам подходит, это должно помочь. Я думаю, что для чтения о различиях это хорошее начало:https://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/http-api-vs-rest.html

Вызванный ответом @dashnug "API Gateway требует от вас стадии, которая добавляется в конце вашей конечной точки" и другого ответа, который я читал в другом месте, я "решил" проблему, сделав спецификацию стадии менее информативной (о которой сценическая среда) с помощью v1как сцена. Это также предполагает некое управление версиями API, что приемлемо и в моем случае.

Так что мой serverless.yml раздел теперь содержит:

provider:
  name: aws
  runtime: python3.6
  memorySize: 512
  region: ${opt:region, 'eu-west-1'}
  profile: ${opt:profile, 'default'}
  stage: ${opt:stage, 'v1'}  # A trick to don't end up with "production" or "staging" as stage.
Другие вопросы по тегам