使用 Google Cloud Functions 的微服务 API 网关

Posted

技术标签:

【中文标题】使用 Google Cloud Functions 的微服务 API 网关【英文标题】:Api gateway for Microservices with Google Cloud Functions 【发布时间】:2020-03-19 06:24:17 【问题描述】:

输入

例如,我们有一些服务。

    账户服务 产品服务 支付服务

每个服务都是一个单独的 Google Cloud Function。 每个服务都有自己的 HTTP API。例如,账户服务有:

    https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/account/sign-up https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/account/sign-in https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/account/reset-password 等

每个服务都有自己的 swagger 文档端点 /docs

问题

如何将我的 Cloud Functions 设为私有(没有公共访问权限)并将它们放在某个 API 网关后面?

注意事项

Google 为 Cloud Functions 提供端点(请参阅https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions)。 但是,据我了解,Endpoints 只允许您定义 yaml OpenAPI 文件。

在这个 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: HOST
schemes:
  - https
produces:
  - application/json
paths:
  /hello:
    get:
      summary: Greet a user
      operationId: hello
      x-google-backend:
        address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/helloGET
      responses:
        '200':
          description: A successful response
          schema:
            type: string

但就我而言,我需要能够代理我的云功能(如反向代理)。

【问题讨论】:

【参考方案1】:

您可以使用端点。当然,您必须手动定义您的 OpenAPI yaml 文件(版本 2.0,而不是 3!)。使用通配符和路径翻译定义

...
paths:
  /account/*:
      get:
        summary: sign-up a user
        operationId: sign-up
        x-google-backend:
          address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net
          path_translation: APPEND_PATH_TO_ADDRESS
       responses:
          '200':
            description: A successful response
            schema:
              type: string

APPEND_PATH_TO_ADDRESS 只需将路径值粘贴到后端定义的末尾即可。顺便说一句,仅使用此定义,您就可以访问所有私有函数端点和子端点,就像您的 swagger 文档一样。

您可以使用 API KEY (I wrote an article on this) 保护您的网关,但文档中还有另一种安全解决方案。

但是,您不能使用 Endpoint 建议的开发者门户,因为它基于 Endpoint yaml 文件定义,而不是聚合所有发现的服务定义(在您的 /docs 路径中)。

【讨论】:

谢谢你的回答,我试试看【参考方案2】:

使用 apigee,它是谷歌云平台的一部分,专为您的用例而设计

【讨论】:

【参考方案3】:

关于您的问题 - 如何将我的 Cloud Functions 设为私有(没有公共访问权限)并将它们放在某个 API 网关后面?

如果您想管理云功能访问级别(如开发/更新/部署或调用或无访问权限),您可以通过 Cloud IAM 服务 (https://cloud.google.com/iam/) 来实现。

除此之外,Apigee(API Gateway) 也有一个很好的机制来实现这个目标。

在 Apigee 中尝试执行这些步骤-

    载入您的端点(您可以参考 - https://docs.apigee.com/) 将您的 Apigee 板载端点封装到 Apigee API 产品中,您可以在其中将 API 产品配置为仅具有某些 API 端点。 向产品添加开发者应用程序(您可以为产品名称添加前缀,例如公共、保留或私有)。您可能希望将多个此类开发人员应用程序连接到不同类型的产品并为它们获取多个凭据集。现在根据开发者APP(Credentials set)所附加的API产品类型,您可以将您的google函数设为public或private。

查看 Apigee 开箱即用提供的 OAuth 安全性链接 - https://www.youtube.com/watch?v=hZbyR8L-IIs

【讨论】:

【参考方案4】:

实现控制访问的 GCP 方式是通过 IAM 服务帐户link。

在这种情况下,有必要:

将 Cloud Function Invoker Role 分配给调用此函数的服务(例如 App Engine、GKE 和 Cloud Tasks)的服务帐号。 通过要求 IAM 权限来限制云功能。 Link

这样做,Cloud Function URL 将是私有的,任何未经身份验证的用户都将收到 403 HTTP 错误。

【讨论】:

以上是关于使用 Google Cloud Functions 的微服务 API 网关的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Cloud SDK 列出所有 Cloud Functions?

使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题

Google Cloud Functions 部署问题

使用 Google Cloud Functions 的微服务 API 网关

Google Cloud Platform:Cloud Functions 与 App Engine

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]