【问题标题】:How to set endpoint path to my google cloud function (using serverless framework)如何为我的谷歌云功能设置端点路径(使用无服务器框架)
【发布时间】:2020-10-21 21:19:55
【问题描述】:

我正在使用无服务器框架在 GCP 中部署云功能,配置如下:

service: myname

provider:
  name: google
  stage: prod
  runtime: nodejs10
  region: us-central1
  project: myname
  credentials: keyfile.json
  environment:
    IS_PROD: 'true'

plugins:
  - serverless-google-cloudfunctions

package:
  exclude:
    - node_modules/**
    - .gitignore
    - .git/**

functions:
  clear:
    handler: clearCommand
    events:
      - http: clear

我使用的是serverless-google-cloudfunctions插件版本3.1.0。部署后,地址/路径如下:

https://us-central1-myname.cloudfunctions.net/myname-prod-clear

我想知道是否有办法自己设置路径如下:

https://us-central1-myname.cloudfunctions.net/clear

有没有办法设置这个?首选无服务器框架方式。

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions serverless-framework


    【解决方案1】:

    您可以在serverless.yml中的函数定义中指定name,如Gareth's comment in Guillaume's answer中所述。

    所以,在你的serverless.yml 中,会像下面这样,

    functions:
      clear:
        name: clear
        handler: clearCommand
        events:
          - http: clear
    

    但是,请注意,在serverless-google-cloudfunctions 3.1.0 版本中,函数名称分配仍然存在问题。部署工作正常,GCP 中部署的函数名称也正确。但在serverless deploy执行结束时的部署状态中并没有正确反映。

    编辑: 部署状态问题已在 3.1.1 版本中修复。

    在较早的版本中,我们仍然需要执行以下 hacky 变通方法来手动更新node_modules 中的serverless-googlecloudfunctions

    info/lib/displayServiceInfo.js中,替换当前的getFunctionNameInService函数实现,

    const getFunctionNameInService = (funcName, service, stage) => {
      let funcNameInService = funcName;
      funcNameInService = funcNameInService.replace(service, '');
      funcNameInService = funcNameInService.replace(stage, '');
      funcNameInService = funcNameInService.slice(2, funcNameInService.length);
      return funcNameInService;
    };
    

    const getFunctionNameInService = (funcName, service, stage) => {
      let funcNameInService = funcName;
      funcNameInService = funcNameInService.replace(`${service}-`, '');
      funcNameInService = funcNameInService.replace(`${stage}-, '');
      return funcNameInService;
    };
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      使用无服务器框架,这似乎是不可能的。看the source code中的这一行

      deploymentName 是自动生成的,没有参数可以覆盖它。我没有深入寻找 clear 值的设置位置,但显然它是一个静态值。

      实际上是您可以在控制台中找到的 Cloud Functions 的名称。如果你自己部署功能,你可以选择你想要的名字,从而达到你想要的效果

      【讨论】:

      • 您实际上可以为函数命名任何您想要的名称;只需将name 作为参数添加到函数定义中
      • 我在the documentation 中没有看到这个。您有示例或文档链接吗?
      【解决方案3】:

      链接的最后一部分是 Cloud Functions 名称。创建 Cloud Functions 时已完成,如果您使用 Cloud Console 创建 Cloud Functions,您只需介绍名称即可。

      另一方面,如果您使用gcloud 部署您的Cloud Functions,则必须添加参数名称,例如:

      gcloud 函数部署 my_function --runtime=python37 --trigger-event=providers/cloud.firestore/eventTypes/document.write --trigger-resource=projects/project_id/databases/(默认)/documents/messages/{ pushId}

      这将导致如下结果:

      https://us-central1-myname.cloudfunctions.net/[Your_CFName]

      请注意,一旦您将 Cloud Functions 命名为 couldn't be changed

      【讨论】:

        猜你喜欢
        • 2020-12-21
        • 2019-12-13
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 2022-01-26
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多