如何在Colab中使用不同邮箱连接Google Cloud Storage
Colab登录邮箱与GCP账号邮箱不一致时连接Cloud Storage的方案
默认使用以下代码做GCS认证时,会自动复用Colab界面当前登录账号的身份上下文,要求该账号必须和持有目标GCS资源的GCP账号一致,否则会直接抛出权限拒绝报错:
from google.colab import auth auth.authenticate_user()
要跨不同邮箱账号完成连接,直接用下面两种经过验证的方案即可:
方案1:服务账号密钥认证(最稳定,无账号绑定限制)
这个方案完全不依赖Colab当前登录的任何账号,是跨账号访问GCS的通用方案:- 登录持有目标GCS资源的GCP控制台,创建一个服务账号,给该账号分配对应操作级别的GCS权限:只读需求就配
Storage Object Viewer,读写需求就配Storage Object Admin,遵循最小权限原则不要开多余权限。 - 给建好的服务账号生成JSON格式的身份密钥文件,把这个密钥文件直接上传到Colab会话的本地文件目录(点左侧边栏文件图标就能看到上传入口)。
- 注释掉原来的
auth.authenticate_user()代码,改用密钥文件初始化GCS客户端,示例代码如下:
from google.cloud import storage import os # 引号里替换成你上传的密钥文件在Colab里的实际路径 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/content/你的服务账号密钥文件名.json" # 初始化客户端,此时凭证完全来自密钥文件,和Colab登录账号无关 client = storage.Client() # 测试连接:打印当前凭证有权限访问的存储桶列表,正常返回就说明连接成功 print(list(client.list_buckets()))注意:服务账号密钥拥有对应资源的全部操作权限,不要把密钥文件随笔记、代码仓库公开泄露,临时会话用完直接删除即可。
- 登录持有目标GCS资源的GCP控制台,创建一个服务账号,给该账号分配对应操作级别的GCS权限:只读需求就配
方案2:强制触发手动账号选择,登录目标GCP账号
不想用服务账号的话,可以清掉Colab默认的认证缓存,强制弹出账号选择窗口,手动选择有GCS权限的目标邮箱完成授权即可,代码如下:from google.colab import auth # 清除现有默认认证缓存,强制触发账号选择授权流程 auth.authenticate_user(clear_output=True)弹出授权页面后,不要选择Colab当前默认登录的邮箱,手动选择/登录持有GCP资源的目标邮箱,走完授权流程即可。
注意:授权完成后不要再跑无参数的auth.authenticate_user(),否则会覆盖当前手动授权的凭证,切回Colab默认账号再次触发权限报错。
踩坑提示:如果用gcloud CLI命令操作GCS,跨账号授权后记得执行
gcloud config set account 你的目标GCP邮箱切换CLI的激活账号,避免CLI还是用旧凭证调用接口。
内容的提问来源于stack exchange,提问作者Tugrul Gokce
相关产品推荐
相关产品推荐

