我是 GCP 新手,希望能够得到我所缺少的快速答案。
我有一个项目,其中运行着一个 GCE VM。我想不时将数据集备份到 GCP 的对象存储中。我的计划是从 cron 作业运行“gsutil rsync ...”。
我创建了一个存储桶供该作业使用。我没有编辑存储桶上的权限、角色或任何内容。
我运行“sudo su -”,这样我就以 root 身份运行,正如我期望 cron 作业那样,然后输入
gsutil rsync -r -d <要备份的目录> gs://<bucket>/
我得到了
AccessDeniedException:403 权限不足
在此状态下,我输入了“gcloud config list”,结果显示
帐户 = <xyz>[电子邮件保护]
disable_usage_reporting = True
project = <项目 ID>
您当前使用的配置是:[默认]
这是我创建虚拟机时创建的默认服务帐户。我没有对其进行任何编辑。
在控制台中,我转到 IAM->服务帐户,单击此服务帐户,单击权限选项卡,然后我看到此服务帐户是 <project id> 上的编辑器
在控制台中,我转到 Cloud Storage,浏览,单击我的存储桶,转到权限选项卡,然后我看到编辑者的角色具有“存储旧存储桶所有者”和“存储旧对象所有者”角色。查看这些角色,我被告知第一个角色具有对现有存储桶的读/写访问权限,并具有对对象的创建/列出/删除权限。第二个角色授予我对现有对象的读/写访问权限。
我已经确认该存储桶目前是空的。
我需要做什么才能使我的 gsutil 命令以足够的权限运行?
答案1
最有可能的问题是 Compute Engine VM 实例云 API 访问范围不足。
该gsutil rsync
命令需要以下权限:
- 存储.对象.创建
- 存储.对象.删除
- 存储.对象.列表
- storage.objects.get # 存储桶到存储桶复制所需
该角色roles/editor
不具备上述任何权限。
Google Cloud Compute Engine VM 实例使用两种方法进行授权:
- 默认服务帐户
- 云 API 访问范围
服务帐户必须具有授予上述权限的角色,或者必须授予服务帐户身份对存储桶及其内容的访问权限。Google Cloud Storage 支持两种不同的授权方法。为简单起见,我建议您向服务帐户添加必需角色。对于您的用例gsutil rsync
,我建议添加角色roles/storage.legacyBucketOwner
。
但是,即使服务帐户通过角色具有所需的权限,Compute Engine Cloud API 访问范围也可以夺走这些权限。转到 Google Cloud Console,选择您的 VM 实例。检查启用了哪些范围。您应该启用“存储:完整”或“允许完全访问所有 Cloud API”。否则,服务帐户将受到 gsutil 授权所需的 OAuth 访问令牌所获权限的限制。