在AWS Lambda中使用Puppeteer搭配S3托管的@sparticuz/chromium-min时出现加载错误与“Unexpected end of data”异常
我来帮你排查这个「Unexpected end of data」的问题,这个错误大概率和Chromium压缩包的下载、解压环节出了问题有关,结合你的配置,咱们一步步来定位解决:
先检查S3 URL和权限是否正确
你代码里的chromiumPackUrl写的是https://bucket-name.s3.region.amazonaws.com/file.tar,这里要替换成实际的桶名和区域哦!比如你的桶叫chromium-pupeteer-bucket,区域如果是us-east-1的话,正确URL应该是https://chromium-pupeteer-bucket.s3.us-east-1.amazonaws.com/file.tar。另外,虽然IAM角色给了S3全权限,但可以临时把S3里的tar文件设为公开读测试下,排除权限访问的问题。确认上传的tar包是否完整未损坏
「Unexpected end of data」最常见的原因就是压缩包本身损坏或者上传不完整。你可以把S3里的tar包下载到本地,尝试用tar -xf file.tar命令解压看看,如果解压失败,说明文件有问题。建议重新从@sparticuz/chromium-min的官方渠道下载对应Lambda运行环境(x86_64/arm64)的tar包,然后用AWS CLI上传(避免控制台拖拽大文件可能出现的中断),命令如下:aws s3 cp ./chromium-min.tar s3://chromium-pupeteer-bucket/给Lambda足够的内存和超时时间
Chromium运行需要不少资源,Lambda默认的128MB内存肯定不够,建议至少设置为1024MB,同时把超时时间调到30秒以上——下载和解压Chromium包需要时间,资源不足会导致解压过程中断,抛出类似错误。你可以在serverless.yml的函数配置里加上:functions: createPDF: handler: src/pdf/pdf.handler memorySize: 1024 timeout: 30 events: - httpApi: path: /pdf method: post验证依赖版本兼容性
确保@sparticuz/chromium-min和puppeteer-core的版本匹配,版本不兼容也会引发奇怪的错误。你可以查看@sparticuz/chromium-min的文档,确认它支持的Puppeteer版本范围,然后调整package.json里的依赖版本。添加详细日志排查细节
在代码里加更多日志,把下载和解压过程的细节打出来,方便定位问题:const puppeteer = require("puppeteer-core"); const chromium = require("@sparticuz/chromium-min"); module.exports.handler = async (event) => { console.log("we got this far") const { pdfUrl } = JSON.parse(event.body) console.log(pdfUrl) const chromiumPackUrl = "https://chromium-pupeteer-bucket.s3.<你的区域>.amazonaws.com/file.tar" try { console.log("开始下载Chromium包:", chromiumPackUrl); const execPath = await chromium.executablePath(chromiumPackUrl); console.log("获取到可执行文件路径:", execPath); const browser = await puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: execPath, headless: chromium.headless, ignoreHTTPSErrors: true }); console.log("浏览器启动成功"); // 这里可以继续添加PDF生成的逻辑 } catch (error) { console.error("完整错误信息:", error); return { statusCode: 500, body: JSON.stringify({ error: error.message }) } } }这样能看到到底是下载失败还是解压环节出了问题,方便进一步排查。
备注:内容来源于stack exchange,提问作者Eb3us

