通过不同项目中的云存储桶触发云功能

Trigger of a cloud function by a cloud storage bucket in different project

我有一个要求,我需要触发一个云功能,一旦文件被放置在另一个项目的 google 云存储桶中,该功能就会触发数据流作业。 Google 文档说这是不可能的,请看这里 https://cloud.google.com/functions/docs/calling/storage

但是,我尝试这样做,但我的云函数部署失败并出现以下错误。它说

这似乎是一个权限问题,如果获得所需的权限,这将有效。 我是否需要从我尝试访问另一个项目(项目 B)

的存储桶的位置向项目(项目 A)的 @appspot.gserviceaccount.com 添加并授予所有者权限

所以如果以上是真的,在我的项目 B IAM 页面中,我将看到如下所示的 2 @appspot.gserviceaccount.com 所有者 @appspot.gserviceaccount.com 编辑

非常感谢对此的任何意见。

Google documentation says its not possible

这就是您需要知道的全部内容。这不可能。无论您看到什么样的错误消息,都没有解决方法。

暂时无法从其他项目中捕获事件。但是有一个解决方法。

  • 在有bucket的项目中,创建一个PubSub notification on Cloud Storage
  • 在您创建的主题上,创建推送订阅。使用 Cloud Functions URL,并保护 PubSub 调用(您可以从 there 中获得灵感。如果您遇到困难,请告诉我,我将花更多时间来描述这部分)
  • 在 Cloud Functions 上将 PubSub 服务帐户授予 cloudfunctions.invoker 角色

编辑 1

安全部分一开始并不容易。在您的项目 B(您拥有云存储的地方)中,您创建了一个 PubSub 主题。关于这个主题,您可以使用在项目 B 中创建的服务帐户创建通知。注意填写好听众

然后,您需要在项目 A

的 Cloud Function 上将此“项目 B”服务帐户授予为 roles/cloudfunctions.invoker
# Create the service account
gcloud iam service-accounts create pubsub-push --project=<ProjectB>

#Create the push subscription
gcloud pubsub subscriptions create \
  --push-endpoint=https://<region>-<projectA>.cloudfunctions.net/<functionName> \
  --push-auth-service-account=pubsub-push@<projectB>.iam.gserviceaccount.com \
  --push-auth-token-audience=https://<region>-<projectA>.cloudfunctions.net/<functionName> \
  --topic=<GCSNotifTopic> --project=<ProjectB>

#Grant the service account
gcloud functions add-iam-policy-binding --member=serviceAccount:pubsub-push@<ProjectB>.iam.gserviceaccount.com --role=roles/cloudfunctions.invoker <FunctionName> --project=<projectA>

最后一个陷阱:

  • 项目 A 中的 Cloud Functions 没有相同的签名,如果它是 HTTP 函数(可由 pubsub 推送订阅调用)或后台函数(可由事件调用,例如 CLoud Storage 事件)。您需要根据 the documentation
  • 更新此内容
  • 发送到 Cloud Functions 的 PubSub 消息略有不同。注意相应地更新输入参数。