Как удалить сцену из 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.