同一机器下如何同时使用Gcloud服务账号与用户账号?
问题原因
gsutil的凭证加载逻辑和gcloud存在差异:它会读取所有可找到的boto配置文件(包括用户目录下的.boto,以及gcloud生成的legacy_credentials目录里的服务账号.boto文件)。只要这些配置里同时存在OAuth用户账号和OAuth服务账号两种类型的凭证,gsutil就会因无法自动确定使用优先级而抛出冲突错误。哪怕你用gcloud auth激活了服务账号,只要其他配置文件里还有用户账号的凭证记录,gsutil依然会触发这个问题。
可行解决方案
1. 临时指定凭证执行gsutil
直接在gsutil命令里指定服务账号对应的boto配置文件,无需修改全局设置:
gsutil --boto-config /data/home/user/.config/gcloud/legacy_credentials/upload@my-bucket.iam.gserviceaccount.com/.boto cp example.file gs://my-bucket/
这种方式完全不影响原用户账号的使用,每次需要用服务账号上传时添加参数即可。
2. 临时用环境变量覆盖凭证
在当前终端会话中设置BOTO_CONFIG环境变量,让gsutil只加载服务账号的配置:
export BOTO_CONFIG=/data/home/user/.config/gcloud/legacy_credentials/upload@my-bucket.iam.gserviceaccount.com/.boto # 后续执行的gsutil命令都会使用服务账号凭证 gsutil cp example.file gs://my-bucket/
要切回原用户账号,只需取消该环境变量:
unset BOTO_CONFIG
3. 使用应用默认凭证(推荐)
设置gcloud的应用默认凭证为服务账号,这样gsutil会自动优先使用该凭证,同时原用户账号的凭证依然保留:
gcloud auth application-default login --key-file bucket-creds.json
之后无论gcloud的活跃账号是什么,gsutil都会默认使用这个应用默认凭证执行操作,除非手动指定其他配置。
4. 注释全局boto里的用户账号凭证
编辑全局.boto文件(路径/data/home/user/.boto),找到[Credentials]段下的用户账号相关配置,例如:
[Credentials] gs_oauth2_refresh_token = xxxxxxx gs_oauth2_client_id = xxxxxxx gs_oauth2_client_secret = xxxxxxx
在这些行前添加#注释掉,这样gsutil就只会加载服务账号的凭证。需要使用原用户账号时,取消注释即可。
5. 用gcloud配置文件隔离账号
创建一个专门用于上传的gcloud配置文件,切换到该配置时自动使用服务账号:
# 创建新配置文件 gcloud config configurations create upload-profile # 为该配置绑定服务账号 gcloud config set account upload@my-bucket.iam.gserviceaccount.com --configuration upload-profile # 激活该配置 gcloud config configurations activate upload-profile # 此时执行gsutil会自动使用服务账号凭证 gsutil cp example.file gs://my-bucket/ # 切回原用户账号的默认配置 gcloud config configurations activate default
内容的提问来源于stack exchange,提问作者Ed F
相关产品推荐
相关产品推荐

