如何使用AWS服务调度Python脚本?——每周运行调用多子脚本的main.py的最佳方案
嘿,这个问题我太熟悉了!结合你提到的「4个Python脚本(main调用另外三个)、每周运行一次」的具体场景,我来给你拆解最适合的AWS服务方案,尽量讲得通俗易懂,适合架构新手~
首推方案:AWS Lambda + Amazon EventBridge
这是目前无服务器时代最省心、成本最低的定时任务方案,完全不用管服务器维护,非常适合你的场景。
为什么适合你?
- 无服务器,零运维:不用自己搭建或管理EC2实例,AWS会自动处理资源分配、运行环境这些琐事。
- 成本极低:Lambda只有在代码运行时才收费,而且有免费额度(每月100万次请求+40万GB秒的计算时间),像你这种每周运行一次的任务,基本可以免费使用。
- 完美适配定时触发:EventBridge(原CloudWatch Events)可以轻松设置每周运行的定时规则,精准触发Lambda执行你的
main.py。
具体步骤(一步步来,很简单)
打包你的Python代码
- 把
main.py、script1.py、script2.py、script3.py放在同一个文件夹里。 - 如果你的脚本用到第三方依赖(比如
requests、pandas),需要把依赖也打包进去(或者用Lambda层单独管理,更灵活)。注意要针对Lambda的Python运行环境打包(比如用Amazon Linux的环境,避免本地Windows/Mac的依赖不兼容)。 - 把整个文件夹压缩成ZIP包。
- 把
创建Lambda函数
- 登录AWS控制台,进入Lambda服务,点击「创建函数」。
- 选择「从头开始创作」,给函数起个名字(比如
WeeklyPythonScriptRunner),选择对应的Python运行时(比如Python 3.11)。 - 在「代码」标签页,上传你刚才打包的ZIP包。
- 设置handler:如果你的
main.py里有一个入口函数(比如def handler(event, context):,这个函数里调用你的业务逻辑),就填main.handler;如果直接要运行main.py的主逻辑,也可以把主逻辑放到handler函数里。
设置EventBridge定时触发
- 进入EventBridge服务,点击「创建规则」。
- 规则类型选「计划」,然后设置定时表达式:用Cron表达式,比如每周日凌晨2点运行就是
0 2 ? * SUN *(Cron表达式的格式是分 时 日 月 周 年)。 - 目标选择「Lambda函数」,然后选中你刚才创建的Lambda函数,完成配置。
备选方案:Amazon EC2 + Linux Cron
如果你的脚本有非常复杂的依赖(比如需要特定的系统库、运行时间超过15分钟——Lambda的最大运行时间是15分钟),那可以考虑用EC2搭配Cron定时任务。
具体步骤
启动EC2实例
- 选一个合适的AMI(比如Amazon Linux 2,自带Python环境),选一个低成本的实例类型(比如t2.micro,免费额度内可用)。
- 给实例分配IAM角色(如果脚本需要访问其他AWS服务的话),设置安全组允许必要的访问。
部署脚本
- 用SCP或者Git把你的4个脚本上传到EC2实例的某个目录(比如
/home/ec2-user/scripts/)。 - 安装依赖:运行
pip3 install [你的依赖包]。
- 用SCP或者Git把你的4个脚本上传到EC2实例的某个目录(比如
设置Cron定时任务
- 运行
crontab -e编辑定时任务。 - 添加一行:
0 2 * * 0 python3 /home/ec2-user/scripts/main.py(意思是每周日凌晨2点运行脚本)。 - 保存退出,Cron会自动生效。
- 运行
额外优化:节省成本
如果你的EC2只需要每周运行一次,可以设置EventBridge规则,在任务运行前启动实例,运行完成后停止实例,避免一直运行实例浪费钱。
方案对比&总结
| 方案 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Lambda+EventBridge | 无运维、成本极低、日志自动存CloudWatch | 最大运行时间15分钟,依赖打包需注意兼容 | 轻量脚本、定时短任务 |
| EC2+Cron | 灵活,支持复杂依赖/长时间运行 | 需要管理服务器,成本较高 | 复杂脚本、运行超15分钟的任务 |
对你的场景来说,Lambda+EventBridge绝对是首选,省心又省钱,基本不用操心运维的事儿。如果后续脚本变复杂了,再考虑切换到EC2也不迟。
内容的提问来源于stack exchange,提问作者Juan Almada




