如何排查GSutil复制文件到GCS时403拒绝的访问主体?
排查gsutil 403访问拒绝的主体身份方法
直接查看当前gsutil使用的身份
- 执行命令
gcloud auth list,输出中带*标记的账号就是当前gsutil默认使用的身份。如果是个人邮箱格式(如xxx@xxx.com),则为操作系统用户;如果是xxx-compute@developer.gserviceaccount.com这类格式,则是Compute Engine服务账号。 - 也可以用更直接的命令
gsutil whoami,会直接返回执行当前操作的主体邮箱,一眼就能区分身份类型。
- 执行命令
验证Compute Engine实例的服务账号配置(如果在GCE实例上操作)
- 在实例内执行:
curl http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email -H "Metadata-Flavor: Google",返回的是实例绑定的默认服务账号邮箱。将其与gsutil whoami的结果对比,就能确认是否在使用实例的服务账号。 - 如果实例未启用服务账号或权限不足,gsutil会自动使用本地缓存的用户认证(比如之前通过
gcloud auth login登录的账号)。
- 在实例内执行:
检查本地认证缓存
- 查看本地认证目录
~/.config/gcloud/credentials下的文件,里面存储着已认证的账号信息。若文件内容是个人邮箱,说明用的是操作系统用户身份;若为服务账号邮箱,则是使用了服务账号密钥文件进行认证。
- 查看本地认证目录
关于Log Explorer无记录的说明
- 可能是日志延迟,等待数分钟后再查询;也可能是日志范围或过滤器有误,需确保选择了目标GCS资源所在的项目,并用正确的过滤器(如
protoPayload.methodName:"storage.objects.create" AND protoPayload.status.code:403)。若仍无记录,大概率是认证环节提前失败(如密钥无效、本地身份缓存过期),这类情况不会生成GCS访问日志。
- 可能是日志延迟,等待数分钟后再查询;也可能是日志范围或过滤器有误,需确保选择了目标GCS资源所在的项目,并用正确的过滤器(如
内容的提问来源于stack exchange,提问作者Thorsten Staerk
相关产品推荐
相关产品推荐

