如何在AWS Lambda函数和Serverless框架中从URL中删除stage?

37
我正在使用 Serverless 框架在 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。那个dev是配置文件中stage参数的默认值。 在serverless.yml文件中指定stage: something将使/something成为URL的后缀,并成为函数的一部分。
问题:如何从生成的URL端点中删除阶段规范,或者如何防止阶段规范成为生成的URL的一部分? (阶段是函数的一部分是可以接受的。这将很容易在AWS Lambda仪表板上区分stagingproduction函数。)
5个回答

50

你可以做的一件事情是使用你拥有的自定义域名 (例如 mycompany.com) 并将其映射到你的 API Gateway。这样,你不再需要向 https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/ 发送请求,而是发送请求到 https://api.mycompany.com/

有一个叫做serverless-domain-manager 的插件可以更轻松地设置自定义域名。请查看这篇博客文章以获取完整的操作指南。


2
{btsdaf} - Jochem Schulenklopper
2
{btsdaf} - Alex

33

在本地环境下,我们可以在运行dev服务器时使用标志--noPrependStageInUrl:sls offline start --noPrependStageInUrl,当使用无服务器离线时。在线上环境中,我们可以设置一个CloudFront或自定义域名。


6
这应该是被接受的答案,非常感谢 :) - nedo
1
非常烦人的是这不是被接受的答案,而其他解决方案却有更高的赞同票数。非常感谢您!太棒了! - Berns
2
因为这不是问题的答案。问题是关于serverless deploy命令,而不是serverless offline - Елин Й.

25

这是 API 网关的特性/约定,与 Serverless 框架无关,所以 serverless 无法对其进行任何处理。

API 网关要求您提供一个阶段(stage),并将其附加在您的端点结尾处。

API Gateway 的端点是针对开发人员而设计的,因此不是为了用户友好而设计的。

如果您希望其对用户友好,可以为之添加自定义域名。不同的阶段可以有不同的自定义子域名。


12

可以使用httpApi来解决此问题,它不会像http一样在URL路径前添加阶段名称。

改为使用:

functions:
  index:
    handler: handler.index
    events:
      - http: # <-- change this
          path: /
          method: get

使用这个

functions:
  index:
    handler: handler.index
    events:
      - httpApi: # <-- to this
          path: /
          method: get

http键创建API Gateway的“REST”(又名v1)端点,而httpApi创建“HTTP”(又名v2)端点。v1具有更多功能,但v2更快速和更便宜。

来自Serverless文档

尽管它们的名称令人困惑,但两个版本都允许部署任何HTTP API(如REST、GraphQL等)。

完整比较https://docs.aws.amazon.com/en_us/apigateway/latest/developerguide/http-api-vs-rest.html


对于我的情况,我必须进一步将 payload: '1.0' 添加到函数配置中。 - Henry Luo

7

受@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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接