首页 > 解决方案 > 是否可以有 2 个不同的 pubsub 指向单个 cloudfunction?

问题描述

我有项目 A 和项目 BI 在项目 AI 中创建了接收器、发布/订阅、云函数,希望将日志记录中的日志传输到 bigquery 数据集。所以我过滤了日志,用这些日志创建了接收器,创建了一个云函数来传输日志到bigquery。它成功了。

我希望将项目 B 的日志定向到项目 AI 中的 CloudFunction,在项目 B 中创建了另一个接收器和主题(Pub/Sub),在项目 A 中创建了另一个订阅(Pub/Sub),并从我创建的项目 B 中选择了主题。

所以我在项目 A 中有两个订阅。在一个子中,我有来自项目 A 的日志和另一个子,我有来自项目 B 的日志。我希望将两个订阅消息都定向到同一个 CloudFunction。

来自 2 个不同项目的 2 个订阅,如下所示:

在此处输入图像描述

问题是我只能在项目 A 的 CloudFunction 中选择一个发布/订阅。 在此处输入图像描述

有没有办法从一个 CloudFunction 中的两个订阅获取日志?或任何其他替代方法?如果问题不清楚,请告诉我。如果需要,我将添加更多解释和屏幕截图。

标签: google-cloud-platformgoogle-cloud-functionsgoogle-cloud-pubsub

解决方案


在后台,当您创建由云发布订阅主题触发的后端函数时,云函数将为该主题创建一个新订阅。因此,您有一个与订阅的 1 对 1 映射。在您的情况下,一种解决方法是拥有 2 个 PUSH 订阅,其中一个端点指向您的 HTTP 函数。

编辑 1

下面分步解决使用推送订阅,将消息发布到 HTTP 功能。

  1. 创建仅使用 HTTPS 和所需身份验证触发的 HTTP 云函数 (CF)。更多细节可以在这里找到
  2. 成功部署该功能后,可以通过遵循以下模式的 URL 访问它:https://<REGION>-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
  3. 对于您的主题,在任何项目中,与您的 CF 或其他相同,创建一个 PUSH 订阅:
  • 推送端点:你的 CF 的 URL
  • 选中启用身份验证
  • 选择服务帐户 (SA)
  • Audience : 你的 CF 的 URL
  1. 赋予可以在任何项目、Cloud Functions Invoker角色上的SA。您的云功能(云功能屏幕中的权限选项卡)
  2. 赋予 service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.comService Account Token Creator角色,其中 {PROJECT_NUMBER} 是包含订阅的 GCP 项目。

下面是一个简单的 Python 中的 HTTP 云函数实现:

import base64
import json


def handle_pubsub_push_subscription_message(request):
    envelope = json.loads(request.data.decode('utf-8'))
    payload = base64.b64decode(envelope['message']['data']).decode('utf-8')
    print(f"payload: {payload}")
    # Returning any 2xx status indicates successful receipt of the message.
    return "SUCCESS", 200

以及部署 HTT 功能的命令示例:

gcloud functions deploy <FUNCTION_NAME> \
--entry-point handle_pubsub_push_subscription_message \
--project <PROJECT_ID> \
--region <REGION> \
--memory 128Mi \
--runtime python39 \
--trigger-http \
--security-level=secure-always

推荐阅读