如何从 AWS Lambda 函数 + 无服务器框架的 URL 中删除阶段?
Posted
技术标签:
【中文标题】如何从 AWS Lambda 函数 + 无服务器框架的 URL 中删除阶段?【英文标题】:How to remove stage from URLs for AWS Lambda functions + Serverless framework? 【发布时间】:2018-04-02 02:40:16 【问题描述】:我正在使用无服务器框架在 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
参数的默认值。
在serverless.yml
文件中指定stage: something
将使/something
作为URL 中的后缀,并作为函数的一部分。
问题:如何从生成的 URL 端点中删除阶段规范,或者:如何防止该阶段规范成为生成的 URL 的一部分?
(舞台是函数的一部分,这很好。这将很容易在 AWS Lambda 仪表板中分离 staging
和 production
函数。)
【问题讨论】:
【参考方案1】:这可以通过使用httpApi
而不是http
来解决。而不是
functions:
index:
handler: handler.index
events:
- http:
path: /
method: get
使用这个
functions:
index:
handler: handler.index
events:
- httpApi:
path: /
method: get
如果您不依赖与http
一起使用的 REST 协议,并且 HTTP 协议对您来说很好,那么这应该可以解决问题。对于阅读差异,我认为这是一个好的开始:
https://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/http-api-vs-rest.html
【讨论】:
【参考方案2】:在本地环境中,我们可以在运行开发服务器时使用标志 --noPrependStageInUrl:sls offline start --noPrependStageInUrl
离线使用无服务器时。在线,我们可以设置 CloudFront 或自定义域。
【讨论】:
这应该是公认的答案,非常感谢:)【参考方案3】:由@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.
【讨论】:
【参考方案4】:这是一个 API 网关功能/约定,并非来自无服务器框架,因此 serverless
对此无能为力。
API Gateway 要求您使用一个阶段,并将其附加在您的端点的末尾。
API Gateway 端点是为开发人员设计的,因此它并不便于用户使用。
如果您希望它对用户友好,您可以为其添加自定义域。不同的阶段可以有不同的自定义子域。
【讨论】:
【参考方案5】:您可以做的一件事是使用您拥有的自定义域(例如mycompany.com
)并将其映射到您的 API 网关。这样,您无需向https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/
发出请求,而是向https://api.mycompany.com/
发出请求。
有一个名为serverless-domain-manager
的插件可以更轻松地设置此自定义域。查看this blog post,了解如何使用它的完整演练。
【讨论】:
谢谢 - 很好的答案。我希望我能接受你和@dashmug 的回答。因为他来得早一点,而且还提供了更多的解释(提到这是一个 API Gateway 约定),所以我接受了他的回答。感谢您提供指向serverless-domain-manager
的链接!
没问题! @dashmug 有一个很好的答案。很高兴你得到了你想要的东西。以上是关于如何从 AWS Lambda 函数 + 无服务器框架的 URL 中删除阶段?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?
使用无服务器部署 AWS Lambda 函数在需要外部模块时不会部署
AWS Lambda&Fargate 无服务底层技术是如何实现的