如何将无__main__入口的Python脚本迁移至AWS Lambda运行?
Python定时任务迁移AWS Lambda问题解答
核心结论
Lambda 无法直接调用没有handler入口的脚本,不需要强制添加__main__,但必须提供符合Lambda规范的handler函数。
最优解决方案
方案1:给原脚本加handler函数(推荐)
直接在cronjob/run.py里新增一个Lambda handler函数,把原脚本的执行逻辑包裹进去,既不破坏原有功能,又适配Lambda:
def lambda_handler(event, context): # 把原run.py里所有从顶到底执行的代码放到这里 # 比如原脚本的import、业务逻辑、任务代码,全部移到这个函数内 # 示例: # import os # import boto3 # print("执行定时任务") # s3 = boto3.client('s3') # s3.put_object(Bucket='my-bucket', Key='test.txt', Body='hello') # 保留这行可以让原脚本在本地依然能正常执行(和之前EC2上的调用逻辑一致) if __name__ == "__main__": lambda_handler(None, None)
之后在Lambda控制台配置handler为cronjob/run.lambda_handler(格式是[脚本文件名].[handler函数名])。
方案2:新建独立入口脚本(不改动原代码)
如果不想修改原run.py,可以新建一个比如lambda_entry.py的文件,作为Lambda的入口:
import sys # 把run.py所在的cronjob目录加入Python路径 sys.path.insert(0, './cronjob') # 导入run.py时,原脚本的代码会自动执行 import run def lambda_handler(event, context): # 原脚本代码已经在导入时执行了,这里可以加日志、错误捕获,或者留空 pass
然后Lambda的handler配置为lambda_entry.lambda_handler即可。
额外注意点
- 原脚本依赖的第三方包,要打包成Lambda层或者一起打包到部署包中,确保Lambda环境能找到依赖。
- 如果原脚本用到EC2本地资源(比如本地文件、特定系统命令),要替换成AWS云服务(比如S3存文件,用AWS SDK替代系统命令)。
- 定时触发逻辑用AWS EventBridge(原CloudWatch Events)配置,替代EC2上的crontab,设置对应的触发规则即可。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

