google-cloud-platform - 是否可以有 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 中的两个订阅获取日志?或任何其他替代方法?如果问题不清楚,请告诉我。如果需要,我将添加更多解释和屏幕截图。
解决方案
在后台,当您创建由云发布订阅主题触发的后端函数时,云函数将为该主题创建一个新订阅。因此,您有一个与订阅的 1 对 1 映射。在您的情况下,一种解决方法是拥有 2 个 PUSH 订阅,其中一个端点指向您的 HTTP 函数。
编辑 1
下面分步解决使用推送订阅,将消息发布到 HTTP 功能。
- 创建仅使用 HTTPS 和所需身份验证触发的 HTTP 云函数 (CF)。更多细节可以在这里找到
- 成功部署该功能后,可以通过遵循以下模式的 URL 访问它:
https://<REGION>-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
- 对于您的主题,在任何项目中,与您的 CF 或其他相同,创建一个 PUSH 订阅:
- 推送端点:你的 CF 的 URL
- 选中启用身份验证
- 选择服务帐户 (SA)
- Audience : 你的 CF 的 URL
- 赋予可以在任何项目、
Cloud Functions Invoker
角色上的SA。您的云功能(云功能屏幕中的权限选项卡) - 赋予 service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
Service 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
推荐阅读
- c# - 蹲着不冲刺?
- powershell - 将 PowerShell 函数绑定到参数
- haskell - 如何为我的 Haskell 包的可执行文件安装 Bash 完成?
- node.js - 从 Koa 控制器操作返回承诺,但有错误
- tsql - 在单行上显示相关子记录
- python - 列表长度达到一定限制后如何停止附加值?
- robotframework - 如何从一个文件中调用另一个测试用例
- python - 是否有一种算法可以计算 NLP 中单词抽象程度的数值等级?
- x86 - 引用 32 位和 64 位版本程序的最正确方法
- reactjs - 在 ThemeProvider 中使用 React Toolbox Tabs 时出现错误