如何解决导入关联其他项目表的Google BigQuery视图时的403权限问题
解决BigQuery跨项目视图访问的403权限问题
你遇到的问题很典型——当BigQuery视图引用了其他项目的表时,执行查询的身份必须同时拥有原视图所在项目的访问权限,以及被引用表所在项目的权限。你的代码里用了cred_1(project1的服务账号)初始化客户端,但这个账号没有被授权访问project2的目标表,所以抛出了403错误。
先指出你代码里的一个小笔误:
# 原代码错误:cred.project_id 应为 cred_1.project_id client = bigquery.Client(credentials=cred_1, project=cred_1.project_id)
方案1:给project1的服务账号添加project2表的访问权限(推荐)
你不需要合并两个凭证文件,只需要让当前使用的cred_1服务账号拥有访问project2表的权限即可:
- 登录Google Cloud控制台,进入project2
- 找到目标表
dataset.table,进入它的权限设置页面 - 添加
cred_1对应的服务账号邮箱(打开project1.json找到client_email字段的值) - 给这个账号分配以下两个角色:
BigQuery Data Viewer:允许读取表数据BigQuery Job User:允许在project2中执行查询作业(按需分配)
- 权限生效后,用修正后的原代码就能正常查询视图了,因为
cred_1现在有权访问project2的表
方案2:使用一个拥有双项目权限的统一服务账号
如果场景允许,可以创建一个单独的服务账号,同时获取两个项目的访问权限:
- 在任意项目中创建服务账号,下载它的凭证文件
- 在project1中给该账号分配访问
dataset.view的权限 - 在project2中给该账号分配访问
dataset.table的权限 - 用这个单一凭证初始化BigQuery客户端,即可同时访问两个项目的资源
方案3:临时切换客户端(仅适用于特殊场景)
如果确实需要用两个不同服务账号操作不同项目资源,可以创建两个客户端实例:
client1 = bigquery.Client(credentials=cred_1, project=cred_1.project_id) client2 = bigquery.Client(credentials=cred_2, project=cred_2.project_id)
但注意:这个方案对你当前的视图查询场景无效,因为查询视图时,BigQuery会用执行查询的客户端身份(client1)去访问关联表,所以还是需要给client1的账号授权project2表的访问权限。
修正后的完整代码示例
import pandas as pd from google.cloud import bigquery from google.oauth2 import service_account #----------BigQuery Connect--------------- cred_1 = service_account.Credentials.from_service_account_file(filename="project1.json") # 修正project_id引用错误 client = bigquery.Client(credentials=cred_1, project=cred_1.project_id) # --------- from Bigquery----------------------------------- statement = """select * FROM `project1.dataset.view`""" query_job = client.query(statement) result = query_job.result() df = result.to_dataframe() print(df.head())
内容的提问来源于stack exchange,提问作者Gross
相关产品推荐
相关产品推荐

