You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serverless部署时Google Drive API认证找不到凭据文件如何解决

问题根因

别在路径写法上反复试了,这个ENOENT: no such file or directory, open '/var/task/google-cloud-credentials.json'报错和路径怎么拼没关系,核心是你用Serverless部署时,google-cloud-credentials.json根本没被打进最终上传到运行环境的部署包。Serverless函数(不管是AWS Lambda还是其他FaaS平台)运行时的根目录固定是/var/task,文件不在这个目录里,你写多少种相对/绝对路径都没用。
之前同类配置能跑,基本是因为旧的打包配置默认会包含根目录的json文件,后续调整构建规则、Serverless配置的时候不小心把这个文件排除了。

修复方案

按优先级选方案就行:

  • 优先用环境变量传凭证的方案,彻底绕开文件路径问题,这也是Serverless场景的标准做法:
    1. 打开本地的google-cloud-credentials.json,复制里面全部JSON内容,存成Serverless配置里的环境变量,比如命名为GOOGLE_CREDENTIALS
    2. 把初始化代码改成下面这样,不需要读本地文件:
const drive = google.drive({
  version: 'v3',
  auth: new google.auth.GoogleAuth({
    credentials: JSON.parse(process.env.GOOGLE_CREDENTIALS),
    scopes: ['https://www.googleapis.com/auth/drive.file'],
  }),
});

这个方案不用管打包规则,也不会出现凭证不小心随代码提交的问题,稳定性最高。

  • 如果一定要用本地文件读取的方式,先查打包配置:
    1. 如果你用Serverless Framework部署,检查serverless.yml里的package.patterns配置(老版本对应package.include/exclude字段),确认没有全局排除*.json,显式把凭证文件加入打包白名单:
package:
  patterns:
    - '!node_modules/**'
    - 'google-cloud-credentials.json'
    - 'dist/**' # 替换成你自己的构建输出目录
  1. 如果你用了esbuild、webpack这类构建工具,检查构建配置有没有加静态资源拷贝规则,这类工具默认只会打包被import/require依赖到的代码,静态json文件不会被主动拷贝到输出目录,需要加对应loader或者拷贝插件,把凭证文件拷贝到构建产物的根目录。
  2. 配置完先本地执行打包命令(比如sls package),解压.serverless目录下生成的部署zip包,确认google-cloud-credentials.json在zip的根目录,这时候直接写keyFile: 'google-cloud-credentials.json'就能正常读取,不需要加__dirname或者多层相对路径。
快速验证方法

调整配置后可以在函数入口加一行临时调试代码,部署后触发看日志:

const fs = require('fs');
console.log('运行目录文件清单:', fs.readdirSync('/var/task'));

如果日志打印的列表里能看到google-cloud-credentials.json,说明文件已经正确部署,再调整路径就不会报找不到文件的错误。

内容的提问来源于stack exchange,提问作者ffx292

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:39:16