BigQuery Python脚本权限问题:用户缺少bigquery.jobs.create权限
报错信息
Access Denied: Project [project]: User does not have bigquery.jobs.create permission in project [project]
核心问题
你混淆了用户(User@gmail.com)的权限和服务账号(loginSA)的权限。你的Python代码通过服务账号密钥(key.json)访问BigQuery,此时生效的是服务账号本身的项目/数据集权限,而非关联用户的权限。从权限列表来看,你给User@gmail.com分配了项目级BigQuery Job User角色,但服务账号loginSA本身并没有被直接授予创建Job的权限——你给用户设置的服务账号Editor权限,只是让用户能管理该服务账号,不代表服务账号拥有项目级权限。
正确配置方案(仅开放单个数据集)
1. 给服务账号添加项目级Job权限
在项目IAM页面,直接为服务账号loginSA@[myproject].iam.gserviceaccount.com分配BigQuery Job User角色(roles/bigquery.jobUser)。这个角色仅允许服务账号在项目下创建Job,不会自动开放所有数据集的访问权限。
2. 限制Job权限到指定数据集(可选增强安全)
如果要严格限制服务账号只能为shared_reports数据集创建Job,可通过IAM条件细化权限:
- 编辑服务账号的BigQuery Job User角色,添加以下条件:
resource.type == "bigquery.googleapis.com/Job" && resource.labels.dataset_id == "shared_reports"
3. 保留必要的数据集权限
你已在shared_reports数据集上给服务账号分配了BigQuery Data Viewer/Editor等角色,这部分配置正确,确保服务账号能读写该数据集内的表。
4. 清理冗余权限
- 移除User@gmail.com在服务账号上的Editor角色(无必要且增加风险)
- 移除User@gmail.com项目级的Create Service Accounts、Service Account Key Admin角色(若用户不需要管理其他服务账号)
- 服务账号无需Create Service Accounts、Service Account Key Admin角色(除非它需要管理其他服务账号)
验证方法
配置完成后,可通过以下命令测试服务账号权限:
# 激活服务账号 gcloud auth activate-service-account loginSA@[myproject].iam.gserviceaccount.com --key-file=key.json # 测试创建Job权限 gcloud bigquery jobs list --project=[myproject] # 测试访问指定数据集 bq query --use_legacy_sql=false 'SELECT * FROM `[myproject].shared_reports.table1` LIMIT 10'
内容的提问来源于stack exchange,提问作者Nikolay Kazimirov

