You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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.ymlcustom节点下添加这段配置,确保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-lambdamiddy等依赖到最新兼容版本
    这样能获得更好的稳定性和兼容性,减少潜在的版本兼容问题。

验证修复

修改完成后,重新执行serverless deploy部署到AWS,然后通过Postman发起请求测试。如果还是有问题,可以登录AWS控制台查看Lambda函数的代码结构,确认node_modules/chrome-aws-lambda/bin目录下的chromium.br等文件是否存在。

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

火山引擎 最新活动