如何从AWS Lambda函数+无服务器框架的URL中删除阶段?

时间:2017-10-20 21:05:36

标签: amazon-web-services aws-lambda serverless-framework serverless-plugins

我正在使用无服务器框架在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仪表板中分离stagingproduction功能很容易。)

4 个答案:

答案 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.