使用服务帐号访问同一组织中不同项目的 BigQuery 数据

使用服务帐号访问同一组织中不同项目的 BigQuery 数据

我在将官方 BigQuery 客户端(Python 3 版)迁移到由 Cloud Run 服务授权的同一组织中的另一个项目时遇到了严重的问题。

Cloud Run 服务位于 Project Main 中,我正尝试访问 Project Other 中的表 - 这两个项目都在同一个组织中。

该服务帐户是在 Project Main(不是默认帐户)中创建的用户创建的服务帐户,并且具有作为 Project Main 中的服务帐户运行所需的所有权限,并且该服务帐户的电子邮件在 Project Other 中仅被赋予了“BigQuery 用户”角色。

在 Python 中,我有如下代码片段:

from google.cloud import bigquery

query_str = "SELECT * FROM `project_other.prod.table`"

bqclient = bigquery.Client()
df = bqclient.query(query_str).result().to_dataframe()

它运行在项目主目录中部署到 Cloud Run 的容器内,并且该部署附加了正确的服务帐户。

当触发脚本时,我最终遇到如下异常:

raise self._exception google.api_core.exceptions.BadRequest: 400 Access Denied: Table
project_other:prod.table: User does not have permission to query table project_other:prod.table. at [4:13]

据我了解,如果附加到 Cloud Run 部署的服务帐户具有所需的权限,则您不必在容器中执行任何花哨的身份验证,因为这一切都是由托管服务“为您完成”的。

有人能帮我弄清楚为什么会发生这种情况吗?服务帐户iam.serviceAccounts.actAs在 Project Main 中拥有权限,但它是否也需要 Project Other 中的这些权限,或者 BigQuery 用户角色是否足够?

答案1

要查询表,您需要权限bigquery.tables.获取数据. BigQuery User 的角色bigquery.tables.列表. 将角色更改为BigQuery 数据查看器(角色/bigquery.dataViewer)。

BigQuery 预定义角色和权限

要修改/写入表,您需要权限bigquery.tables.updateData。该权限属于以下角色:

  • BigQuery 管理员(roles/bigquery.admin)
  • BigQuery 数据所有者 (roles/bigquery.dataOwner)
  • BigQuery 数据编辑器 (roles/bigquery.dataEditor) <- 推荐角色。

相关内容