无法访问Google Cloud Storage Bucket:参数及权限问题排查
嘿,咱们来一步步拆解你遇到的问题,其实是几个不同的小问题凑到一起了:
1. 本地电脑的DefaultCredentialsError
这个问题很直白——本地环境没有配置Google Cloud的身份验证凭据。GCE虚拟机因为绑定了项目的默认服务账号,所以能自动获取凭据,但本地电脑不行。解决办法有两个:
- 方法一:设置环境变量
把GOOGLE_APPLICATION_CREDENTIALS环境变量指向你的服务账号密钥文件(JSON格式),比如在终端里:# Linux/macOS export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json" # Windows(PowerShell) $env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\service-account-key.json" - 方法二:代码里显式加载凭据
如果不想设置环境变量,也可以在代码里直接指定密钥文件:from google.cloud import storage from google.oauth2 import service_account credentials = service_account.Credentials.from_service_account_file('/path/to/your/key.json') client = storage.Client(credentials=credentials)
2. GCE虚拟机上的双重错误(403 + 400)
你看到的两个错误其实是连锁反应,先看JSON里的400错误:
Invalid string value: 'noAcl:'. Allowed values: [full, noacl]
这说明请求里的projection参数传错了——多了个冒号,正确值应该是noacl或者full。这个参数格式错误会导致请求不合法,进而触发后续的权限校验问题。
再看403错误:
606507140911-compute@developer.gserviceaccount.com does not have storage.buckets.get access to landsbyconst.
这里还有个关键细节:你代码里写的是client.get_bucket('landsst'),但错误信息里的Bucket名称是landsbyconst甚至lanst——明显是Bucket名称拼写错误!先确认你要访问的Bucket准确名称到底是什么,别打错字。
就算名称对了,GCE的默认服务账号也需要目标Bucket的storage.buckets.get权限,你可以这么配置:
- 登录Google Cloud Console,找到目标Bucket,进入「权限」页面
- 添加
606507140911-compute@developer.gserviceaccount.com为成员 - 给它分配「Storage Bucket Viewer」或者「Storage Object Viewer」角色(根据你的实际需求选择)
另外,也可以尝试更新google-cloud-storage库,旧版本可能存在参数拼接的bug:
pip install --upgrade google-cloud-storage
3. 为什么自己创建的Bucket能正常访问?
因为你创建Bucket时,默认会给当前项目的服务账号(包括GCE的默认服务账号)分配对应的权限。而你现在访问的这个Bucket(不管是landsst还是错误里的landsbyconst),要么是其他项目的,要么是权限没有配置到位。
快速修复 Checklist
- 本地:配置凭据环境变量或在代码里显式加载密钥
- GCE:
- 修正Bucket名称的拼写错误
- 更新
google-cloud-storage依赖库 - 给默认服务账号添加目标Bucket的访问权限
内容的提问来源于stack exchange,提问作者Rocketq

