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场景的标准做法:
- 打开本地的
google-cloud-credentials.json,复制里面全部JSON内容,存成Serverless配置里的环境变量,比如命名为GOOGLE_CREDENTIALS - 把初始化代码改成下面这样,不需要读本地文件:
- 打开本地的
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'], }), });
这个方案不用管打包规则,也不会出现凭证不小心随代码提交的问题,稳定性最高。
- 如果一定要用本地文件读取的方式,先查打包配置:
- 如果你用Serverless Framework部署,检查
serverless.yml里的package.patterns配置(老版本对应package.include/exclude字段),确认没有全局排除*.json,显式把凭证文件加入打包白名单:
- 如果你用Serverless Framework部署,检查
package: patterns: - '!node_modules/**' - 'google-cloud-credentials.json' - 'dist/**' # 替换成你自己的构建输出目录
- 如果你用了esbuild、webpack这类构建工具,检查构建配置有没有加静态资源拷贝规则,这类工具默认只会打包被import/require依赖到的代码,静态json文件不会被主动拷贝到输出目录,需要加对应loader或者拷贝插件,把凭证文件拷贝到构建产物的根目录。
- 配置完先本地执行打包命令(比如
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
相关产品推荐
相关产品推荐

