部署Google App Engine时如何留存文件系统中用户上传的图片?
Google App Engine 部署后本地上传图片丢失问题解决方案
问题核心原因
Google App Engine(GAE)的实例文件系统为临时存储,所有写入本地磁盘的内容仅在该实例的生命周期内有效。触发实例重建的操作(包括新版本部署、实例自动扩缩容、实例健康检查重启等)都会清空本地磁盘的所有自定义写入内容,这是平台的固有设计。
持久化存储解决方案(彻底解决部署丢失问题)
方案1:替换为Google Cloud Storage(GCS)存储上传文件
这是GAE生态下的官方推荐方案,完全规避临时文件系统的限制:- 替换Multer的本地存储引擎为GCS存储引擎,安装对应依赖后,用户上传的文件会直接写入GCS存储桶,不经过实例本地磁盘
- 公开访问的文件可以直接开启存储桶的公开读权限,访问链接格式固定,不受GAE部署影响
- 代码修改参考:将原本
multer.diskStorage的配置替换为GCS存储的配置,上传成功后直接返回GCS的文件访问地址即可,无需再操作本地文件系统
方案2:挂载Google Cloud Filestore(适用于需要POSIX文件系统接口的场景)
如果你的业务逻辑必须依赖本地文件系统的读写操作,无法直接改造为对象存储调用,可以给GAE灵活环境实例挂载Filestore的共享存储卷:- 在同一VPC下创建Filestore实例,配置对应的访问权限
- 修改GAE的
app.yaml配置,添加卷挂载声明,将上传目录指向挂载的Filestore路径 - 所有实例写入该挂载目录的内容都会持久化保存,部署、实例重启都不会丢失,还支持多实例共享访问
注意:该方案仅适用于GAE灵活环境,标准环境不支持自定义卷挂载
现有本地文件备份方法
如果当前还存在运行中的实例,且里面有未备份的上传文件,可以按照以下步骤操作备份:
- 使用
gcloud app instances ssh命令登录到当前运行的实例 - 进入你存储上传图片的公开文件夹,使用
tar命令打包所有图片文件:tar -czvf upload-images-backup.tar.gz /path/to/your/upload/folder - 使用
gcloud compute scp命令将打包好的备份文件从实例传输到本地机器或者直接上传到GCS存储桶保存
注意:如果实例已经被重建,本地存储的文件无法找回,请尽快在实例存活期间完成备份操作。
临时规避方案(不推荐长期使用)
如果暂时来不及改造存储逻辑,可以临时禁用GAE的滚动部署策略,每次部署前手动备份现有实例的上传文件,部署完成后再将备份文件上传到新实例的对应目录,但该方案无法应对实例自动扩缩容、异常重启导致的文件丢失问题,仅适合短期过渡使用。
内容的提问来源于stack exchange,提问作者Tejas Shirnalkar
相关产品推荐
相关产品推荐

