【问题标题】:Google Cloud Functions Public URLGoogle Cloud Functions 公开网址
【发布时间】:2017-08-24 17:35:14
【问题描述】:

如何设置公共路由到 HTTP GCF? 所以,目前的默认路径是这样的。

https://us-central1-poised-breaker-162819.cloudfunctions.net/function-1

但是我想这样用

https://myfunction.com

https://myfunction.com/thisroute

所以实际上是命名空间的问题,甚至是对适当函数的请求的代理问题。如何做到这一点?

更新 1

看来,我们可以为此使用 Endpoints 服务。但目前还不清楚它是否适用于 GCF。

【问题讨论】:

  • 我不相信这可以在 Google 的云平台中完成 - 因为您需要某种 API 网关来将您的自定义路由转换为类似于 AWS 的 API 网关和 Lamba 的云功能路由.您可以考虑为您的服务构建一个吗?
  • @Rynak,你的意思是谷歌云不提供这样的功能作为服务吗?当前的解决方案是使用 nginx 作为代理运行单独的 VM。我只是不知道这对于 Google Cloud 而言是否是一个好的解决方案。
  • 是的,这不是最好的解决方案,但 Google 目前正在追赶 AWS 等提供 API 网关即服务的公司。
  • @Ryank API Gateway 成本相当高(远高于运行函数本身的成本),通过 http 调用 lambda 函数的唯一方法是使用它。相比之下,由 http 触发的 Google Functions 会自动配置一个 https 端点供您使用,而无需任何额外费用。但是,如果您仍想代理 url,可以查看 Cloud Endpoints 或 App Engine 或其他东西。
  • @QuestionAndAnswer 我能想到的一种方法是使用 Google App Engine(您可以设置自定义域并导入您自己的 TLS 证书,或者只使用自动配置的 appspot.com 网址)和使用它将请求路由到云功能。如果你使用这个方法,你可能也可以通过 pub/sub 而不是 http 调用该函数。

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


【解决方案1】:

Cloud Endpoints 充当云功能的 API 网关。

云功能https://[CLOUD_FUNCTION_REGION].cloudfunctions.net/my-function

  1. 在 Cloud shell 中设置项目 ID

    gcloud config set project [PROJECT_ID]
    
  2. 将 ESPv2 Beta 部署到 Cloud Run。将 CLOUD_RUN_SERVICE_NAME 替换为您要用于服务的名称。

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
       --image="gcr.io/endpoints-release/endpoints-runtime-serverless:2" \
       --allow-unauthenticated \
       --platform managed
    

    在命令执行结束时,会有类似下面的细节

    服务 [CLOUD_RUN_SERVICE_NAME] 修订版 [CLOUD_RUN_SERVICE_NAME-00001-ces] 已部署并正在服务 100% 的流量在 https://CLOUD_RUN_SERVICE_NAME-65zrpjcu3q-uk.a.run.app

    注意从上述命令接收的主机名 (CLOUD_RUN_SERVICE_NAME-65zrpjcu3q-uk.a.run.app)

  3. 使用 OpenAPI 规范配置创建 YAML 文件 api.yaml:

      swagger: '2.0'
      info:
        title: Cloud Endpoints + GCF
        description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
        version: 1.0.0
      host: CLOUD_RUN_SERVICE_NAME-65zrpjcu3q-uk.a.run.app
      schemes:
        - https
      produces:
        - application/json
      paths:
        /thisroute:
          get:
            summary: Custom function route
            x-google-backend:
              address: https://[CLOUD_FUNCTION_REGION].cloudfunctions.net/my-function
            responses:
              '200':
                description: A successful response
                schema:
                  type: string
    
  4. 部署端点配置:

    gcloud endpoints services deploy api.yaml
    
  5. 现在,云功能请求可以通过端点https://CLOUD_RUN_SERVICE_NAME-65zrpjcu3q-uk.a.run.app/thisroute进行路由。

  6. 同样要使用自定义域名,需要验证域名。为了 遵循here

  7. 中的步骤

【讨论】:

    【解决方案2】:

    如果你使用几乎相同的firebase函数,你可以做到! https://firebase.google.com/docs/hosting/functions

    【讨论】:

    • 不,我不使用 firebase。
    • 如果你想完成这件事,这就是目前使用 GCP 的方法
    • 找不到我是否在此处留下答案,但我们留下了负责路由解析的单独 Compute Engine 和 nginx 代理服务器。
    • 明白了,你为什么不去appengine代理请求?速度?
    • Compute Engine 看起来要简单得多。 App Engine 完成了很多事情,并允许使用自定义代码、通过 express 或 python 模块进行代理请求,但我认为它的性能无论如何都比 nginx 低。
    【解决方案3】:

    目前不可能。你需要一个 api 代理,老实说,我不建议公开公共 url。

    在我看来,此时最优雅的解决方案是创建基于云 pub/sub 的简单代理应用程序,您可以使其在 gap、gke 或新的云运行上运行,以便您扩展到 0 .

    逻辑可以是动态的,如下所示:

    • 用一些内部逻辑读取请求的url
    • 使用url的路径选择主题
    • 通过发布/订阅主题将负载转发到云功能

    然而,此时您应该问问自己,与让您的应用程序在 gae/gke 上运行(可能使用不同的服务来拆分关注点)相比,这是否真的有用,因为在成本方面可能会更便宜。

    如果您想要针对“api 网关”问题的 SaaS 解决方案,您还可以查看 Apigee

    【讨论】:

      【解决方案4】:

      我认为最好不要使用 HTTP 调用机制,因为它不需要任何身份验证来调用。 尝试使用其他选项 -- https://cloud.google.com/functions/docs/calling

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 2017-11-29
        相关资源
        最近更新 更多