如何将GCE虚拟机上R Studio-server的文件保存至Cloud Bucket?
问题描述
- 在GCE虚拟机上部署了R Studio-server,已挂载Google Cloud Bucket,R中可正常读取Bucket内的数据,但执行
saveRDS()函数保存输出时遭遇权限拒绝错误:
Error in gzfile(file, mode) : cannot open the connection In addition: Warning message: In gzfile(file, mode) : cannot open compressed file 'remote/processed_input_reproduction/file.rds', probable reason 'Permission denied'
- 尝试将GCE实例的存储权限范围改为「Full」后,VM无法完成启动流程,无法通过SSH连接;改回默认的只读权限范围后,VM恢复正常连接,ssh诊断显示VM进入紧急启动模式。
解决方案
方案1:用服务账号实现写入权限(推荐)
不用修改实例的权限范围(保持默认只读),通过单独的服务账号获取Bucket写入权限:
- 在GCP控制台创建一个服务账号,给它分配「Storage Object Creator」或「Storage Admin」权限(按需选择最小权限)
- 下载该服务账号的JSON密钥文件,上传到GCE虚拟机的指定路径(比如
~/gcs-service-key.json) - 在R Studio中设置环境变量指向密钥文件:
Sys.setenv("GOOGLE_APPLICATION_CREDENTIALS" = "~/gcs-service-key.json")
- 如果是用
gcsfuse挂载的Bucket,重新挂载时指定服务账号密钥:
gcsfuse --key-file=~/gcs-service-key.json your-bucket-name /path/to/mount/point
之后就能正常通过挂载路径写入Bucket了。
方案2:修复权限范围修改后的VM启动问题
如果一定要把实例权限范围改成「storage-full」,先解决启动失败的问题:
- 在GCP控制台查看VM的串行控制台日志,确认进入紧急模式的具体原因(大概率是Bucket挂载配置导致系统启动依赖失败)
- 登录VM(先改回只读权限范围),编辑
/etc/fstab中的Bucket挂载配置,添加nofail选项,这样即使挂载失败,系统也能正常启动:
your-bucket-name /path/to/mount/point gcsfuse rw,user,noauto,nofail
- 重新设置实例权限范围为「storage-full」,重启VM,待启动完成后重新挂载Bucket即可。
方案3:绕过挂载,直接用API写入Bucket
在R中不依赖挂载的文件系统,通过Cloud Storage API直接上传文件:
- 安装并加载
googleCloudStorageR包:
install.packages("googleCloudStorageR") library(googleCloudStorageR)
- 配置服务账号密钥(同方案1),然后按以下步骤操作:
# 先把对象保存到本地临时文件 temp_file <- tempfile(fileext = ".rds") saveRDS(your_data_object, temp_file) # 上传到目标Bucket的指定路径 gcs_upload(temp_file, bucket = "your-bucket-name", name = "processed_input_reproduction/file.rds") # 删除本地临时文件 file.remove(temp_file)
内容的提问来源于stack exchange,提问作者RobertoAS
相关产品推荐
相关产品推荐

