我正在使用无服务器框架在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
注意URL端点中的/dev
部分,以及函数中的部分。 dev
是配置文件中stage
参数的默认值。
在stage: something
文件中指定serverless.yml
将在网址中将/something
作为后缀,并作为该功能的一部分。
问题:如何从生成的URL端点中删除阶段规范,或者:如何防止该阶段规范成为生成的URL的一部分?
(该阶段是该功能的一部分,很好。在AWS Lambda仪表板中分离staging
和production
功能很容易。)
答案 0 :(得分:24)
您可以做的一件事是使用您拥有的自定义域(例如mycompany.com
)并将其映射到您的API网关。这样,您就可以向https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/
发出请求,而不是向https://api.mycompany.com/
发出请求。
有一个名为serverless-domain-manager
的插件可以让您更轻松地设置此自定义域。查看this blog post以获取有关如何使用它的完整演练。
答案 1 :(得分:16)
这是一个API网关功能/约定,而不是来自无服务器框架,因此serverless
无法对此做任何事情。
API Gateway需要您使用舞台,并将其附加到您的终端的末尾。
API网关端点适用于开发人员,因此并不意味着用户友好。
如果您希望它对用户友好,您可以为其添加自定义域。不同的阶段可以有不同的自定义子域。
答案 2 :(得分:3)
在本地环境中,我们可以在运行开发服务器时使用--noPrependStageInUrl标志:sls offline start --noPrependStageInUrl
在使用无服务器脱机时。在网上,我们可能会设置一个CloudFront或自定义域。
答案 3 :(得分:1)
由@dashnug的答案触发:“ API网关要求您添加一个阶段,该阶段附加在端点的末尾”,以及我在其他地方阅读的另一个答复,我通过使阶段规范更不易理解来“解决”了问题(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.