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

Joc*_*per 15 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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

注意/devURL端点中的部分以及函数中的部分.这devstage配置文件中参数的默认值.

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

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

(该阶段是该功能的一部分,很好.这将很容易在AWS Lambda仪表板中分离stagingproduction运行.)

Ale*_*lex 26

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

有一个名为插件serverless-domain-manager,可以更容易地设置这个自定义域.查看此博客文章,了解如何使用它的完整演练.

  • 谢谢 - 很好的答案.我希望我能接受你和@ dashmug的回答.因为他早一点,并且还提供了一些解释(提到它是一个API网关惯例),我接受了他的回答.感谢您对`serverless-domain-manager`的链接! (2认同)
  • 没问题!@dashmug有一个很好的答案.很高兴你得到了你想要的东西. (2认同)

das*_*mug 15

这是一个API网关功能/约定,不是来自无服务器框架,所以serverless无法对它做任何事情.

API网关要求您使用阶段,并将其附加在端点的末尾.

API网关端点适用于开发人员,因此它并不意味着用户友好.

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


Tan*_*yer 13

这可以通过使用 来解决httpApi,它不会将阶段添加到 URL 路径,而不是将阶段添加到 URL 路径http

代替

functions:
  index:
    handler: handler.index
    events:
      - http: # <-- change this
          path: /
          method: get
Run Code Online (Sandbox Code Playgroud)

用这个

functions:
  index:
    handler: handler.index
    events:
      - httpApi: # <-- to this
          path: /
          method: get
Run Code Online (Sandbox Code Playgroud)

http密钥创建一个 API 网关“REST”(又名 v1)端点,同时httpApi创建一个“HTTP”(又名 v2)端点。v1 具有更多功能,但 v2 更快、更便宜。

来自无服务器文档

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

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


小智 10

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

  • 这应该是公认的答案,非常感谢:) (6认同)
  • 因为这不是问题的答案。问题是关于“无服务器部署”命令,而不是“无服务器离线”命令 (2认同)

Joc*_*per 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.
Run Code Online (Sandbox Code Playgroud)