29

我正在使用无服务器框架在 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

a 之后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

请注意/devURL 端点中的部分,以及函数中的部分。这是配置文件dev中参数的默认值。stage

stage: somethingserverless.yml文件中指定将/something在 URL 中作为后缀,并作为函数的一部分。

问题:如何从生成的 URL 端点中删除阶段规范,或者:如何防止该阶段规范成为生成的 URL 的一部分?

(阶段是函数的一部分,这很好。这将很容易在 AWS Lambda 仪表板中分离staging和函数。)production

4

5 回答 5

47

您可以做的一件事是使用您拥有的自定义域(例如mycompany.com)并将其映射到您的 API 网关。这样,您无需向 提出请求,而是向https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/提出请求https://api.mycompany.com/

有一个名为的插件serverless-domain-manager可以更轻松地设置此自定义域。查看此博客文章以获取有关如何使用它的完整演练。

于 2017-10-21T17:23:22.970 回答
25

这是一个 API 网关功能/约定,不是来自无服务器框架的,所以serverless对此无能为力。

API Gateway 需要一个阶段,它附加在端点的末尾。

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

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

于 2017-10-21T06:03:12.967 回答
15

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

于 2020-10-19T07:51:50.500 回答
5

由@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.
于 2019-05-08T13:52:41.623 回答
3

这可以通过使用httpApi代替来解决http。代替

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

用这个

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

如果您不依赖与 REST 协议一起使用的 REST 协议,http并且 HTTP 协议对您来说很好,那么这应该可以解决问题。对于阅读差异,我认为这是一个好的开始: https ://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/http-api-vs-rest.html

于 2021-10-02T13:11:20.070 回答