如何将运行Puppeteer的Node.js脚本部署到AWS Lambda实现每日定时运行
方案选型结论
两种方式都可以实现,更推荐通过handler调用独立app.js的方式,后续更新代码维护成本更低,不用每次都改动handler入口逻辑。
前置注意事项
- 默认Lambda Node.js运行时没有内置Puppeteer依赖的Chromium浏览器,也没有你用到的mongodb等第三方依赖,不要直接复制代码到在线编辑器,需要把所有依赖打包成zip包上传,或者用Lambda层(Layer)管理公共依赖
- 需要提前在MongoDB Atlas的IP白名单中添加Lambda的出站IP:如果使用VPC则添加VPC的公网出口IP,未配置VPC的话可以先允许0.0.0.0/0(更稳妥的方案是单独配置Lambda固定公网IP)
- Lambda默认执行超时时间最长15分钟,你的脚本执行耗时如果超过默认的3秒要手动调整超时配置,内存也建议至少配1GB保证Chromium运行流畅
- 如果遇到Puppeteer启动失败的问题,可以替换成适配AWS Lambda的
@sparticuz/chromium和puppeteer-core组合,打包体积更小,兼容性更好
具体实现步骤
方式1:直接整合到index.js
把你app.js里的所有逻辑封装成一个异步函数,直接放到exports.handler里执行即可,示例代码:
// 引入所有需要的依赖,比如puppeteer、mongodb等 const puppeteer = require('puppeteer-core'); const { MongoClient } = require('mongodb'); exports.handler = async (event, context) => { // 你原来app.js里的所有执行逻辑,注意把原来的顶层执行代码封装为异步函数 async function runBookingTask() { // 原有登录、预约、数据库读写逻辑 } try { const result = await runBookingTask(); return { statusCode: 200, body: JSON.stringify({ message: '任务执行成功', data: result }) }; } catch (err) { console.error('任务执行失败', err); throw err; } };
该方式适合小体量脚本,改动量小,但后续维护麻烦,逻辑和入口耦合度高。
方式2:handler调用独立app.js(推荐)
不需要改动原app.js的核心逻辑,只要把核心执行逻辑导出成可调用的异步函数,然后在index.js的handler里引入执行即可:
第一步:修改本地app.js
把原来直接执行的逻辑包装成异步函数导出:
// 修改后的app.js async function runBookingTask() { // 把原有的数据库连接、登录、预约、结果存储全流程逻辑都放到这个函数里 return '执行结果' } // 保留本地执行逻辑,本地运行时仍可正常执行node app.js if (require.main === module) { runBookingTask().then(console.log).catch(console.error); } // 导出函数给Lambda handler调用 module.exports = { runBookingTask };
第二步:编写Lambda入口index.js
const { runBookingTask } = require('./app.js'); exports.handler = async (event, context) => { // 告诉Lambda不要等事件循环空了再返回,避免不必要的执行超时 context.callbackWaitsForEmptyEventLoop = false; try { const taskResult = await runBookingTask(); return { statusCode: 200, body: JSON.stringify({ message: '预约任务执行完成', result: taskResult }) }; } catch (error) { console.error('任务执行出错:', error); throw error; } };
第三步:打包上传到Lambda
在本地项目根目录执行npm install安装所有依赖,然后把整个项目(包括node_modules、index.js、app.js)打包成zip包,注意不要套外层文件夹,直接把所有文件放到zip根目录,然后在Lambda控制台选择上传zip包即可。
定时触发配置
要实现每天凌晨5点运行,直接给Lambda添加EventBridge(CloudWatch Events)触发器即可,cron表达式按需配置:如果用UTC时间对应北京时间5点,填0 21 * * ? *即可。
内容的提问来源于stack exchange,提问作者kwachter
相关产品推荐
相关产品推荐

