GCSFuse挂载公共GCS桶成功但写入报Provided scope(s) are not authorized错误如何解决
排查修复步骤
- 验证运行gcsfuse的资源(通常为GCE虚拟机)的OAuth访问范围
若使用GCE实例,执行命令:
确认返回结果包含gcloud compute instances describe <实例名> --zone <实例所在区> --format="value(serviceAccounts.scopes)"https://www.googleapis.com/auth/devstorage.read_write或更高权限的存储相关scope。如果仅配置了存储读权限scope,会出现挂载成功但写入时报403的问题。scope配置错误时需要先停止实例,修改实例的访问scope后重启,再重新挂载存储桶测试。 - 核查对应服务账号的IAM权限
确认实例绑定的服务账号,在目标GCS存储桶的IAM配置中,至少拥有roles/storage.objectCreator、roles/storage.objectAdmin或roles/storage.admin这类具备写入权限的角色。如果存储桶开启了统一存储桶级IAM权限,无需额外检查对象级ACL,未开启的情况下还需确认服务账号没有被对象级ACL限制写入权限。 - 排查gcsfuse的凭证优先级问题
gcsfuse会优先使用操作系统中当前用户的应用默认凭证,而非实例绑定的服务账号。执行如下命令查看当前生效凭证的scope列表:
确认返回结果中包含存储写入权限的scope。如果手动配置的凭证过期或权限不足,可以执行gcloud auth application-default print-access-token | curl -H "Authorization: Bearer $(cat -)" https://www.googleapis.com/oauth2/v3/tokeninfogcloud auth application-default login重新授权,或者删除~/.config/gcloud/application_default_credentials.json凭证文件,让gcsfuse回退使用实例的服务账号凭证。 - 检查存储桶公共访问限制
即使存储桶开启了公共访问,GCP公共访问默认仅开放读权限,写入操作必须通过认证身份执行,同时近期GCP的公共访问防护规则更新也可能自动拦截公共身份的写入请求。请确保写入操作使用的身份有明确的IAM写入授权,不要依赖公共访问权限执行写入操作。 - 交叉验证排除gcsfuse本身问题
在同一台机器使用gsutil工具执行写入测试:
如果gsutil同样返回403,则可确定是身份权限问题,和gcsfuse本身无关;如果gsutil可以正常写入,则检查gcsfuse挂载参数是否有误,比如是否填错存储桶名、是否通过gsutil cp 本地测试文件 gs://<你的存储桶名>/测试路径--key-file参数指定了错误的密钥文件。
内容的提问来源于stack exchange,提问作者Hoonki
相关产品推荐
相关产品推荐

