【问题标题】:How to remove stage from URLs for AWS Lambda functions + Serverless framework?如何从 AWS Lambda 函数 + 无服务器框架的 URL 中删除阶段?
【发布时间】: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 函数。)

【问题讨论】:

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


    【解决方案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 有一个很好的答案。很高兴你得到了你想要的东西。
          猜你喜欢
          • 2019-07-23
          • 2021-11-03
          • 2023-03-16
          • 2021-09-16
          • 1970-01-01
          • 2017-11-20
          • 2019-01-04
          • 2021-03-10
          • 2016-05-17
          相关资源
          最近更新 更多