如何从 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 仪表板中分离 stagingproduction 函数。)

【问题讨论】:

【参考方案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 函数

AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?

使用无服务器部署 AWS Lambda 函数在需要外部模块时不会部署

AWS Lambda&Fargate 无服务底层技术是如何实现的

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)

aws 如何从生产环境中的 lambda 函数访问 ECS 服务