是否可以有 2 个不同的 pubsub 指向单个云功能?
Posted
技术标签:
【中文标题】是否可以有 2 个不同的 pubsub 指向单个云功能?【英文标题】:Is it possible to have 2 different pubsub to direct to a single cloudfunction? 【发布时间】:2021-10-16 23:08:41 【问题描述】:我有项目 A 和项目 BI 在项目 AI 中创建了接收器、发布/订阅、云函数,希望将日志记录中的日志传输到 bigquery 数据集。所以我过滤了日志,用这些日志创建了接收器,创建了一个云函数来将日志传输到 bigquery。它是成功的。
我希望将来自项目 B 的日志定向到项目 AI 中的 CloudFunction 在项目 B 中创建了另一个接收器和主题(Pub/Sub),在项目 A 中创建了另一个订阅(Pub/Sub)并从项目 B 中选择了我已创建。
所以我在项目 A 中有两个订阅。在一个子中,我有来自项目 A 的日志和另一个子,我有来自项目 B 的日志。我希望将两个订阅消息都定向到同一个 CloudFunction。
来自 2 个不同项目的 2 个订阅,如下所示:
问题是我只能在项目 A 的 CloudFunction 中选择一个发布/订阅。
有没有办法从一个 CloudFunction 中的两个订阅获取日志?或任何其他替代方法?如果问题不清楚,请告诉我。如果需要,我会添加更多解释和屏幕截图。
【问题讨论】:
即使这在配置级别上是不可能的,难道你不能做一个单一的函数和export
一个云函数绑定它两次吗?
我没有明白你的意思..你能解释一下关于 CF 绑定两次的更多信息
暂时搁置从两个不同主题调用云函数的愿望......我不确定是否可以从不同主题(从云功能)项目 - 请参阅问题issuetracker.google.com/issues/173534853 我认为文档对此非常清楚:“云功能可以由发布到与功能相同的云项目中的 Pub/Sub 主题的消息触发。” - 见cloud.google.com/functions/docs/calling/pubsub
正如弗兰克所建议的那样 - 您能否部署相同的云功能(如代码和配置)但具有不同的名称(因为名称是唯一的)和不同的触发器(第一次部署的一个主题,另一个用于第二次部署)?
【参考方案1】:
在后台,当您创建由云发布订阅主题触发的后端函数时,云函数将为该主题创建一个新订阅。因此,您有一个与订阅的 1 对 1 映射。在您的情况下,一种解决方法是拥有 2 个 PUSH 订阅,其中一个端点指向您的 HTTP 函数。
编辑 1
下面分步解决使用推送订阅,将消息发布到HTTP功能。
-
创建仅由 HTTPS 触发且需要身份验证的 HTTP 云函数 (CF)。更多详情可以找到here
函数部署成功后,可以通过以下模式的 URL 访问它:
https://<REGION>-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
对于您的主题,在任何项目中,与您的 CF 或其他相同,创建一个 PUSH 订阅:
-
赋予可以在任何项目中的 SA,
Cloud Functions Invoker
角色。您的云函数(云函数屏幕中的“权限”标签)
为 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
【讨论】:
d4d1290519676f29baf13a7bf18a25bf-dot-r680fc79ac61f7e68p-tp.apps… ---这是订阅创建时的推送端点。这里的主题名称。在 url 中是 dialogflow(来自项目 A 的主题)。当我在项目 A 中创建另一个订阅并从项目 B 中选择主题时,是否需要更改 url 中的主题名称?如果我需要更改,这个整体方法是否有效? 您共享的推送端点是为您创建的后台 pubsub 函数自动创建的。您需要的是一个 HTTP 函数和一个手动创建的推送订阅,其推送端点是 HTTP 云函数 URL。我编辑了我的回复,为您提供更详细的解决方案。如您所见,订阅的推送端点将遵循 HTTP 函数 URL 模式:https://<REGION>-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
。以上是关于是否可以有 2 个不同的 pubsub 指向单个云功能?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 ARM 模板为 2 个不同的 Azure VM 创建具有单个模板的不同 nsg
是否可以从 PubSub 读取消息并将其数据分隔在 PCollection<String> 的不同元素中?如果是这样,怎么做?