AWS Lambda中用Chromium-min生成PDF遇/tmp/chromium无法执行错误
解决AWS Lambda(arm64/Node.js 16.x)中@sparticuz/chromium-min无法执行二进制文件的问题
核心问题定位
报错/tmp/chromium: cannot execute binary file的核心原因是下载的Chromium二进制架构与Lambda的arm64架构不匹配,或二进制文件缺少可执行权限。以下是针对性的解决步骤:
1. 下载对应arm64架构的Chromium二进制包
默认示例可能拉取的是x86_64架构的包,需替换为arm64版本:
- 选择与@sparticuz/chromium-min版本匹配的arm64压缩包(可从官方发布页确认对应版本的arm64资源)
- 在代码中修改下载URL,例如:
const arm64ChromiumUrl = "https://github.com/Sparticuz/chromium/releases/download/v119.0.0/chromium-v119.0.0-arm64-min.zip";
2. 强制设置二进制文件可执行权限
解压后必须为Chromium二进制添加执行权限,否则Lambda环境会拒绝执行:
const chromiumPath = "/tmp/chromium"; fs.chmodSync(chromiumPath, 0o755); // 设置可读可写可执行权限
3. 修正Puppeteer启动配置
确保启动参数适配arm64架构及Lambda环境:
const browser = await puppeteer.launch({ args: [ ...chromium.args, "--no-sandbox", "--disable-dev-shm-usage", // 解决Lambda临时空间不足问题 "--single-process" // arm64环境下可能需要的额外参数 ], executablePath: chromiumPath, headless: chromium.headless, ignoreHTTPSErrors: true, });
4. 版本兼容性校验
- 确认@sparticuz/chromium-min版本与Node.js 16.x兼容(部分高版本chromium-min要求Node.js 18+,可降级至适配Node16的版本)
- 确保Layer中仅包含arm64架构的依赖包,避免混合x86资源
完整示例代码
const puppeteer = require("puppeteer-core"); const chromium = require("@sparticuz/chromium-min"); const fs = require("fs"); const https = require("https"); const unzipper = require("unzipper"); exports.handler = async (event) => { const chromiumPath = "/tmp/chromium"; // 检查并下载arm64 Chromium if (!fs.existsSync(chromiumPath)) { const downloadUrl = "https://github.com/Sparticuz/chromium/releases/download/v119.0.0/chromium-v119.0.0-arm64-min.zip"; await new Promise((resolve, reject) => { https.get(downloadUrl, (res) => { res.pipe(unzipper.Extract({ path: "/tmp" })) .on("close", resolve) .on("error", reject); }); }); // 设置执行权限 fs.chmodSync(chromiumPath, 0o755); } // 生成PDF const browser = await puppeteer.launch({ args: [...chromium.args, "--no-sandbox", "--disable-dev-shm-usage"], executablePath: chromiumPath, headless: chromium.headless, ignoreHTTPSErrors: true, }); const page = await browser.newPage(); await page.setContent("<h1>PDF生成测试</h1><p>arm64 Lambda环境验证</p>"); const pdfBuffer = await page.pdf({ format: "A4" }); await browser.close(); return { statusCode: 200, headers: { "Content-Type": "application/pdf" }, body: pdfBuffer.toString("base64"), isBase64Encoded: true, }; };
内容的提问来源于stack exchange,提问作者dalaz95
相关产品推荐
相关产品推荐

