如何在多台EC2 Spot实例上运行Python脚本并批量启停?
在100台EC2 Spot实例部署爬虫并定时停止的实现方案
首选方案:AWS Batch(一站式批量任务编排)
AWS Batch专为批量计算场景设计,能自动处理Spot实例的创建、任务分发、资源清理,完全匹配你的需求,无需手动管理实例生命周期。
具体步骤:
打包爬虫脚本为Docker镜像
- 把Python脚本、依赖库打包成Docker镜像,推送到AWS ECR(容器注册表)。如果不想用容器,也可以选择EC2类型的Batch环境,直接用自定义AMI。
- 创建Batch任务定义:指定镜像地址、运行命令(如
python /app/spider.py),分配对应CPU/内存资源。
配置Spot计算环境
- 创建Batch计算环境时选择Spot实例类型,设置实例数量上限为100,指定合适的实例规格(比如t3.medium,根据脚本资源消耗选择)。
- 配置IAM角色,赋予Batch创建/管理EC2实例、访问ECR的权限。
创建作业队列并提交任务
- 创建作业队列并关联上述计算环境。
- 提交作业数组(数量设为100)到队列,Batch会自动启动100台Spot实例并行执行任务;也可以单独提交100个作业。
自动终止实例
- Batch默认会在任务完成后,根据计算环境的
Minimum vCPUs配置(设为0)自动终止空闲Spot实例。 - 若要强制一小时后停止,可在任务定义中设置超时时间为3600秒,超时后Batch会终止任务并清理实例;也可通过CloudWatch Events触发Lambda,定时终止计算环境内的实例。
- Batch默认会在任务完成后,根据计算环境的
备选方案:EC2 Auto Scaling + Lambda + CloudWatch Events
如果偏好直接使用EC2实例而非容器,可采用这套手动编排方案:
具体步骤:
制作自定义AMI
- 启动一台EC2实例,安装Python、爬虫依赖,将脚本放到实例指定目录(如
/opt/spider/)。 - 设置开机自启动(比如用systemd编写服务,或在rc.local中添加
python /opt/spider/your_script.py &),确保实例启动后自动运行脚本。 - 将该实例创建为自定义AMI,供Auto Scaling使用。
- 启动一台EC2实例,安装Python、爬虫依赖,将脚本放到实例指定目录(如
创建Spot实例Auto Scaling组
- 创建Launch Template,指定自定义AMI、实例规格、Spot价格上限。
- 创建Auto Scaling组,设置期望容量、最小容量、最大容量均为100,确保一次性启动100台Spot实例。
- 配置IAM角色,赋予Auto Scaling创建Spot实例的权限。
定时停止实例
- 在CloudWatch Events中创建定时规则,触发时间设为实例启动后一小时(或固定时间,若为一次性任务)。
- 触发Lambda函数,在函数中调用AWS SDK(如boto3):要么更新Auto Scaling组的期望容量为0,让其自动终止所有实例;要么直接调用EC2 API终止所有实例。
可选:日志监控
- 配置脚本将运行日志上传到CloudWatch Logs,方便后续排查问题。
关键注意事项
- Spot实例中断处理:Spot实例可能被AWS回收,建议在爬虫脚本中实现断点续爬逻辑,或在Batch中开启任务重试机制,确保任务能在其他实例上继续执行。
- IAM权限配置:确保Batch、Auto Scaling、Lambda等服务的IAM角色拥有足够权限,比如Batch需要
ec2:RunInstances、ec2:TerminateInstances权限,Lambda需要autoscaling:UpdateAutoScalingGroup权限。 - 成本控制:设置合理的Spot价格上限,避免成本超支;任务完成后及时终止实例,减少闲置资源消耗。
内容的提问来源于stack exchange,提问作者AJ222
相关产品推荐
相关产品推荐

