我在将官方 BigQuery 客户端(在 Python 3 中)获取到由 Cloud Run 服务授权的同一组织中的另一个项目时遇到了一些严重问题。
Cloud Run 服务位于 Project Main 中,我正在尝试访问 Project Other 中的表——这两个项目都在同一个组织中。
服务帐户是在 Project Main 中创建的用户创建的服务帐户(不是默认帐户),并且具有在 Project Main 中作为服务帐户运行所需的所有权限,并且服务帐户的电子邮件仅被赋予“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()
这在项目 main 中部署到 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 用户角色是否足够?
要查询表,您需要权限bigquery.tables.getData。BigQuery User 角色具有bigquery.tables.list。将角色更改为BigQuery 数据查看者(roles/bigquery.dataViewer)。
BigQuery 预定义角色和权限
要修改/写入表,您需要权限bigquery.tables.updateData。该权限在角色中: