我正在尝试从Google Cloud VM上传文件到云存储桶。
预期失败,因为与虚拟机关联的服务帐户没有权限:
$ gsutil cp file.png gs://bucket/
Copying file://file.png [Content-Type=image/png]...
AccessDeniedException: 403 Insufficient Permission
据我所知,有两种方法可以解决这个问题:
- 从VM web管理面板修改作用域
- 更改bucket的权限并添加具有写访问权限的服务帐户(我更喜欢这样,因为另一个选项似乎可以访问同一项目中的所有bucket)
然而,似乎这两种解决方案都需要停止VM,这是有问题的,因为它是生产服务器。
有没有办法在不停止虚拟机的情况下修复这个问题?
有两种方法可以控制计算引擎虚拟机的权限。
访问范围- 分配给实例的服务帐户。
这两个方法一起工作。可用的总权限到计算引擎实例的值由服务帐户控制。访问范围然后限制分配的权限发送到虚拟机。
必须关闭虚拟机才能修改Access scope。修改服务帐户角色不需要重启虚拟机
关于云存储访问:
如果业务帐户拥有云存储访问权限,但"存储的访问范围"设置为"None",则即使该业务帐户拥有所需的角色,虚拟机也无法访问云存储。此时需要关闭虚拟机,修改Access Scope,才能访问Cloud Storage。
如果"虚拟机访问范围"开启了"存储",但业务帐户没有"云存储"角色,则虚拟机将无法访问"云存储"。在这种情况下,向服务帐户添加Cloud Storage角色将授予访问Cloud Storage的权限,而无需重新启动虚拟机。
访问范围(OAuth范围)是在Google Cloud IAM之前存在的遗留机制。考虑到您在生产环境中使用该VM,并且不希望关闭实例,我建议执行以下操作:
- 设置虚拟机访问范围为"允许完全访问所有云api"。
- 创建具有所需角色的新服务帐户,并将该服务帐户分配给Compute Engine VM实例。