You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:24:04