Compute Engine克隆Source Repositories仓库遇权限不足问题求助
gcloud source repos权限范围不足的问题 首先得戳破核心问题:你碰到的PERMISSION_DENIED: Request had insufficient authentication scopes错误,根本不是IAM权限不够,而是VM实例的OAuth访问范围(scopes)在底层限制了服务账号能访问的API。
GCE的访问范围相当于一个「API白名单」——哪怕你在IAM给服务账号加了Cloud Source Repositories的读写权限,如果VM的scopes没开source.googleapis.com相关权限,请求照样会被拦下来。默认的Compute Engine服务账号对应的VM scopes通常不会包含源代码仓库的API权限,这就是为啥你加了IAM角色也没用。
下面给你对应解决方案,重点讲你不想停机的那个:
方案一:用独立服务账号临时认证(无需停机)
这个方案完全不用停VM,而且切换账号只会影响当前用户的gcloud CLI配置,不会干扰机器上其他依赖默认服务账号的应用(其他应用如果是通过元数据服务器自动获取认证的,根本不受gcloud CLI账号切换的影响)。
具体步骤:
- 在IAM控制台新建一个服务账号,给它分配Cloud Source Repositories Reader(只读)或者Cloud Source Repositories Writer(读写)角色,按需选择就行。
- 给这个新服务账号生成JSON格式的密钥文件,把它传到你的GCE实例上(比如用
scp或者直接在实例里下载)。 - 在GCE实例上执行命令切换到这个服务账号:
gcloud auth activate-service-account --key-file=/path/to/your-service-account-key.json - 现在再执行克隆或者列表命令就正常了:
gcloud source repos clone myrepo --project=myproject gcloud source repos list --project=myproject - 之后如果想切回原来的默认服务账号,执行:
或者直接设置默认账号:gcloud auth activate-service-account <digits>-compute@developer.gserviceaccount.comgcloud config set account <digits>-compute@developer.gserviceaccount.com
方案二:修改VM的访问范围(需要停机)
如果你非得用默认服务账号,那只能停机后修改VM的访问范围,添加Cloud Source Repositories对应的scope(或者直接选「允许所有Cloud API」的选项)。但你说这个不可接受,就不多展开了。
另外补充一句:你提到的.clone权限确实包含在get权限和Reader角色里,所以IAM配置是没问题的,问题根源就是VM的scopes限制。更新gcloud组件解决不了这个,因为这根本不是组件版本的问题。
内容的提问来源于stack exchange,提问作者Nakilon

