Cloud Run部署时使用ADC访问Google Drive API的无效凭证问题
解决Cloud Run使用ADC访问Google Drive API凭证无效的问题
核心排查与修复步骤
本地OAuth用的是用户身份,Cloud Run的ADC依赖服务账号身份,二者权限体系完全独立,以下是针对性解决方案:
1. 确认项目已启用Google Drive API
登录GCP控制台,进入对应项目的API和服务→已启用的API和服务,确保Google Drive API处于启用状态。项目级的通用权限不会自动启用Drive API,必须手动开启。
2. 给服务账号分配Drive层面的权限
GCP的Editor权限只覆盖GCP资源,和Google Drive权限不互通:
- 找到服务账号的邮箱(格式:
[账号ID]@[项目ID].iam.gserviceaccount.com) - 打开目标Drive文件夹,点击共享,输入该邮箱,分配编辑者权限,等待1-2分钟让权限同步生效
3. 修正代码中的ADC初始化逻辑
Python中使用ADC时,必须明确指定Drive API的权限范围,不要依赖默认范围:
import google.auth from googleapiclient.discovery import build # 必须指定Drive的权限范围 SCOPES = ['https://www.googleapis.com/auth/drive'] def get_drive_service(): # 用ADC获取凭证,无需本地credentials.json credentials, project_id = google.auth.default(scopes=SCOPES) return build('drive', 'v3', credentials=credentials)
- 彻底删除代码中硬编码本地
credentials.json路径的逻辑,确保完全依赖ADC自动获取凭证
4. 检查Cloud Run服务的身份配置
进入Cloud Run服务详情页,点击编辑和部署新版本→容器、变量和秘密→服务账号,确认选中的是你已经配置Drive权限的那个服务账号。同时确保没有设置GOOGLE_APPLICATION_CREDENTIALS环境变量,否则会覆盖ADC的自动获取逻辑。
5. 验证凭证的权限范围
可以在Cloud Run中添加一段测试代码,打印当前凭证的关键信息:
import google.auth credentials, project_id = google.auth.default() print("当前凭证权限范围:", credentials.scopes) print("服务账号邮箱:", credentials.service_account_email)
如果输出的scopes不包含Drive相关权限,说明代码初始化时没有正确传入SCOPES参数,需要调整。
6. 检查Drive API配额
进入API和服务→配额,查看Google Drive API的请求配额是否耗尽,新启用的API可能有初始配额限制,必要时申请调整。
内容的提问来源于stack exchange,提问作者Irsyam Asri Putra
相关产品推荐
相关产品推荐

