![使用服务帐号访问同一组织中不同项目的 BigQuery 数据](https://linux22.com/image/770493/%E4%BD%BF%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%B8%90%E5%8F%B7%E8%AE%BF%E9%97%AE%E5%90%8C%E4%B8%80%E7%BB%84%E7%BB%87%E4%B8%AD%E4%B8%8D%E5%90%8C%E9%A1%B9%E7%9B%AE%E7%9A%84%20BigQuery%20%E6%95%B0%E6%8D%AE.png)
我在将官方 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.tables.updateData。该权限属于以下角色:
- BigQuery 管理员(roles/bigquery.admin)
- BigQuery 数据所有者 (roles/bigquery.dataOwner)
- BigQuery 数据编辑器 (roles/bigquery.dataEditor) <- 推荐角色。