Cloud Function调用BigQuery查询遇bigquery.jobs.create权限缺失问题解决
Cloud Function执行BigQuery查询时权限异常问题解决
背景
近期开发后端服务,通过Firestore触发的Cloud Function将分析数据推送至BigQuery,采用Terraform进行部署。
问题现象
- 本地使用所有者账号运行Python脚本完全正常
- Cloud Function执行时,数据插入操作可正常完成,但查询操作始终抛出
User does not have bigquery.jobs.create permission异常,尽管已为函数的服务账号配置了同项目的roles/bigquery.admin权限
相关代码
可正常执行的插入代码:
errors = client.insert_rows_json(table_id_users, user_data)
无法执行的查询代码:
query = f"SELECT user_id FROM `project-xyz.analytics.users` WHERE user_id = '{user_id}'" query_job = client.query(query) result = list(query_job.result())
原权限配置的Terraform代码:
resource "google_bigquery_dataset_iam_binding" "editor" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.admin" members = [ "serviceAccount:${module.my_function_2.service_account_email}", ] }
额外排查信息
- 在BigQuery表的权限设置中,可见该服务账号已在
BigQuery-Administrator组中,理论上应拥有bigquery.jobs.create权限 - 服务账号日志显示账号拥有该权限,但同时出现权限拒绝错误:
authorizationInfo: [ 0: { resource: "projects/project-xyz" permission: "bigquery.jobs.create" resourceAttributes: {0} } ] ... status: { code: 7, message: "Access Denied: Project higym-ecafb: User does not have bigquery.jobs.create permission in project project-xyz." }
- 通过Terraform创建的服务账号仅在服务账号页面可见,未出现在IAM视图中
解决方案
问题根源在于仅配置数据集级别的IAM权限无法满足BigQuery查询操作的权限要求,需要同时配置BigQuery数据集IAM成员和项目IAM成员的roles/bigquery.admin权限。修正后的Terraform代码如下:
resource "google_bigquery_dataset_iam_member" "admin" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.admin" member = "serviceAccount:${module.my_function_2.service_account_email}" } resource "google_project_iam_member" "admin" { project = var.project_id role = "roles/bigquery.admin" member = "serviceAccount:${module.my_function_2.service_account_email}" }
内容的提问来源于stack exchange,提问作者Teddy
相关产品推荐
相关产品推荐

