【问题标题】:Trigger of a cloud function by a cloud storage bucket in different project不同项目中的云存储桶触发云功能
【发布时间】:2021-03-12 06:34:23
【问题描述】:

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

但是,我尝试这样做,但我的云功能无法部署并出现以下错误。它说

看起来这是一个权限问题,如果提供了所需的权限,这将起作用。 我是否需要添加项目(项目 A)的 @appspot.gserviceaccount.com 并授予所有者权限,我试图从该项目访问另一个项目(项目 B)的存储桶

所以如果上述情况属实,在我的项目 B IAM 页面中,我将看到 2 如下 @appspot.gserviceaccount.com 所有者 @appspot.gserviceaccount.com 编辑器

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

【问题讨论】:

    标签: google-cloud-functions google-cloud-storage google-cloud-iam


    【解决方案1】:

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

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

    编辑 1

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

    然后,您需要在项目 A 的 Cloud Function 上将这个“项目 B”服务帐户授予角色/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 中的云函数是 HTTP 函数(可由 pubsub 推送订阅调用)或后台函数(可由事件调用,例如 CLoud Storage 事件),则其签名不同。你需要根据the documentation更新这个
    • 发送到 Cloud Functions 的 PubSub 消息略有不同。注意相应地更新输入参数。

    【讨论】:

    • 谢谢@guillaume blaquiere。我能够在云存储(项目 B)上创建 PubSub 通知。我为此主题创建了一个推送订阅,并提供了推送端点作为在项目 A 中创建的云函数的触发 url。希望在这一步之前我是正确的。请确认。我有一个 SA,用于在项目 A 中运行云功能,即 service-runner@.iam.gserviceaccount.com。我是否需要授予此 SA 权限才能调用服务云功能?还是需要创建一个新的?请多多指教。
    • 继续我上面的评论,还请告知,如果我可以使用相同的 SA,根据文档,我需要运行它 -> gcloud run services add-iam-policy-binding SERVICE \ --member=serviceAccount:SERVICE-ACCOUNT_NAME@PROJECT-ID.iam.gserviceaccount.com \ --role=roles/run.invoker ,这里的服务名称应该只是cloudfunctions?我并没有被困住,但不确定我是否做对了,以便我可以更进一步。
    • 我在更多指导下编辑了我的答案。让我知道它是否更好
    • 谢谢@guillaume blaquiere。你让它变得如此简单!我尚未完成与服务帐户相关的另一个问题的所有步骤。与项目所有者合作找出问题。如果我在进一步的任何步骤中遇到问题,会通知您。一如既往,感谢您在调查我的问题时提供的所有帮助和耐心。
    【解决方案2】:

    Google 文档说不可能

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

    【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2013-08-13
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-04-04
    • 2021-01-12
    • 2018-08-10
    • 2019-05-29
    相关资源
    最近更新 更多