通过Python编写的Google Cloud Function访问关联Google Sheet的BigQuery数据库时遭遇403权限错误的解决求助
解决BigQuery关联Google Sheet时Cloud Function的403权限错误
我来帮你搞定这个问题!你遇到的Permission denied while getting Drive credentials错误,本质是因为你的BigQuery表关联了Google Sheet,而Cloud Function使用的服务账号没有访问Google Drive的权限——哪怕你给了它Owner角色,也得单独处理Drive的授权,再加上Sheet本身要共享给服务账号才行。下面是一步步的解决方法:
1. 先搞懂错误根源
当BigQuery查询关联Google Sheet的表时,它会后台调用Google Drive API去读取Sheet数据。你的服务账号虽然有项目Owner权限,但默认没有Drive的访问权限,而且关联的Sheet也没共享给这个服务账号,所以就触发了403错误。
2. 给服务账号添加Drive访问权限
用命令行给服务账号添加Drive只读权限(足够满足需求,避免过度授权):
gcloud projects add-iam-policy-binding test-24s --member="serviceAccount:connect-to-bigquery@test-24s.iam.gserviceaccount.com" --role="roles/drive.reader"
如果你的Sheet是私有且仅允许特定账号访问,也可以用roles/drive.file角色,但drive.reader更通用。
3. 把关联的Google Sheet共享给服务账号
这一步很容易被忽略!打开你的Google Sheet,点击右上角的「共享」,输入服务账号邮箱connect-to-bigquery@test-24s.iam.gserviceaccount.com,权限设置为「查看者」,然后发送邀请。
4. 优化Cloud Function代码(可选但实用)
你原来的代码只是打印结果并返回成功消息,改成返回JSON格式的查询结果会让API更有用:
from google.cloud import bigquery import json def hello_world(request): client = bigquery.Client() query = "SELECT order_id, MAX(status) AS last_status FROM `test-24s.Dataset.Order_Status` GROUP BY order_id" query_job = client.query(query) # 将查询结果转换成字典列表,方便转成JSON results = [dict(row) for row in query_job] # 返回JSON格式的响应 return json.dumps(results), 200, {'Content-Type': 'application/json'}
5. 额外注意事项
- 遵循最小权限原则:生产环境别用Owner角色,只给服务账号必要的权限:BigQuery的
roles/bigquery.dataViewer(用于查询表) + Drive的roles/drive.reader就足够了。 - 等待权限生效:IAM权限有时候需要几分钟才能同步,部署完Cloud Function后别急着测试,等2-3分钟再试。
- 检查Sheet权限设置:确保Sheet没有设置「仅组织内成员可访问」这类限制,否则服务账号可能还是访问不了。
内容的提问来源于stack exchange,提问作者Cyrine Meddeb
相关产品推荐
相关产品推荐

