使用Serverless与chrome-aws-lambda在AWS Lambda部署时Chrome二进制文件缺失问题
你遇到的这个ENOENT错误,核心原因是部署到AWS Lambda时,chrome-aws-lambda依赖的Chromium二进制资源没有被正确打包进Lambda部署包,导致运行时找不到chromium.br文件。
为什么本地运行正常?因为本地开发时,node_modules目录完整保留了chrome-aws-lambda/bin下的所有二进制文件;但你使用的serverless-bundle插件(基于Webpack)默认会忽略非JS/JSON类型的文件,打包时直接跳过了这些关键资源,部署后Lambda环境自然找不到它们。
下面是具体的修复步骤:
1. 调整serverless-bundle配置,强制包含二进制资源
在项目根目录创建serverless-bundle.yml文件,添加以下配置,告诉Webpack要复制chrome-aws-lambda的bin目录文件:
custom: bundle: copyFiles: - from: 'node_modules/chrome-aws-lambda/bin/**/*' to: './node_modules/chrome-aws-lambda/bin/'
或者直接在serverless.yml的custom节点下添加这段配置,确保Webpack打包时把Chromium的二进制文件一起打包进部署包。
2. 修复代码中executablePath的调用错误
注意到你代码里的这一行:
const executablePath = event.isOffline ? './node_modules/puppeteer/.local-chromium/linux-706915/chrome-linux/chrome' : await chromium.executablePath
chromium.executablePath是一个异步函数,必须调用它才能获取实际路径,正确写法应该是:
const executablePath = event.isOffline ? './node_modules/puppeteer/.local-chromium/linux-706915/chrome-linux/chrome' : await chromium.executablePath()
虽然这不是当前错误的直接诱因,但修复后能避免后续可能出现的路径获取异常。
3. 升级依赖与运行时(可选但推荐)
你当前使用的nodejs12.x运行时和chrome-aws-lambda@1.20.4版本都已停止维护,Lambda官方也不再支持nodejs12.x。建议:
- 把
serverless.yml中的runtime改为nodejs18.x - 更新
package.json中的chrome-aws-lambda、middy等依赖到最新兼容版本
这样能获得更好的稳定性和兼容性,减少潜在的版本兼容问题。
验证修复
修改完成后,重新执行serverless deploy部署到AWS,然后通过Postman发起请求测试。如果还是有问题,可以登录AWS控制台查看Lambda函数的代码结构,确认node_modules/chrome-aws-lambda/bin目录下的chromium.br等文件是否存在。
内容的提问来源于stack exchange,提问作者Dean




