如何基于CloudFormation实现EC2上Docker Compose的串行批量自动化执行?
自动化EC2实例批量Docker任务的解决方案(限同时运行2台)
下面提供几种落地性强的自动化方案,覆盖不同复杂度场景,可结合CloudFormation实现基础设施即代码化部署:
方案1:Step Functions + Lambda + EC2(可控流程编排)
适合需要可视化监控任务流程、精细控制每一步的场景:
- 任务数据源准备:将所有任务的唯一变量存入DynamoDB或S3,每条记录包含变量值、任务状态(待处理/处理中/已完成),可选关联EC2实例ID。
- Step Functions状态机定义:
- 初始化节点:从数据源拉取最多2条待处理任务,标记为「处理中」。
- 并行执行节点:同时启动指定EC2实例(或通过Launch Template动态创建),并通过SSM Run Command触发实例内的
docker-compose up命令(提前替换好变量)。 - 等待节点:通过两种方式检测任务完成:
- 实例侧:Docker任务结束后,执行本地脚本调用Lambda函数,传递实例ID和任务完成信号(示例命令:
aws lambda invoke --function-name TaskCompleteNotify --payload '{"task_id": "xxx"}' output.log)。 - 云端侧:Lambda定时轮询EC2的CloudWatch日志,匹配任务完成关键字(如
Task finished),触发状态流转。
- 实例侧:Docker任务结束后,执行本地脚本调用Lambda函数,传递实例ID和任务完成信号(示例命令:
- 收尾节点:标记任务为「已完成」,回到初始化节点拉取下一批任务,直到所有任务处理完毕。
- CloudFormation作用:一键创建Step Functions状态机、Lambda函数、SSM文档、IAM权限角色、Launch Template等资源,实现基础设施自动化部署。
方案2:改用ECS/Batch(容器任务最优解)
如果核心需求是批量运行容器任务,直接用ECS或Batch替代裸EC2管理会更高效:
- 镜像与任务定义:将Docker镜像推送到ECR,创建Task Definition,把变量通过环境变量传入(无需在实例上维护Compose文件)。
- 并发控制:
- 用ECS:创建任务队列,设置服务的
desired-count为0,通过RunTaskAPI批量提交任务,同时指定max-concurrent-runs为2,ECS会自动调度,上一个任务完成后启动下一个。 - 用Batch:直接创建Job Queue,设置
compute-environment的最大并发数为2,提交所有任务后Batch自动按限制执行。
- 用ECS:创建任务队列,设置服务的
- CloudFormation作用:定义ECS集群、Task Definition、Batch队列/计算环境、IAM角色等,一键搭建整套任务调度环境。
方案3:SQS消息队列 + EC2 Auto Scaling(轻量低成本方案)
适合简单批量任务,无需复杂编排服务:
- 任务队列配置:将所有变量写入SQS标准队列,设置合理的消息可见性超时。
- EC2启动脚本:在Launch Template中配置用户数据,实例启动后自动执行以下逻辑:
#!/bin/bash INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) QUEUE_URL="你的SQS队列URL" # 循环拉取任务 while true; do # 从SQS拉取一条消息 MESSAGE=$(aws sqs receive-message --queue-url $QUEUE_URL --max-number-of-messages 1 --wait-time-seconds 20) if [ -z "$MESSAGE" ]; then break; fi # 解析变量和消息句柄 TASK_VAR=$(echo $MESSAGE | jq -r '.Messages[0].Body') RECEIPT_HANDLE=$(echo $MESSAGE | jq -r '.Messages[0].ReceiptHandle') # 替换Compose文件变量并执行任务 sed -i "s/PLACEHOLDER/$TASK_VAR/g" /path/to/docker-compose.yml docker-compose up -d && docker-compose logs -f && docker-compose down # 任务完成后删除消息 aws sqs delete-message --queue-url $QUEUE_URL --receipt-handle $RECEIPT_HANDLE done # 无任务时停止实例 aws ec2 stop-instances --instance-ids $INSTANCE_ID - Auto Scaling Group配置:设置ASG的最小实例数为0,最大为2,基于SQS队列的消息数量触发扩容(当队列消息数>0时启动实例)。
- CloudFormation作用:定义SQS队列、Launch Template、ASG、IAM角色(给EC2权限访问SQS和EC2 API),一键部署整套环境。
方案对比
| 方案 | 复杂度 | 运维成本 | 适用场景 |
|---|---|---|---|
| Step Functions+Lambda | 中 | 中 | 需要可视化流程、精细控制的场景 |
| ECS/Batch | 低 | 低 | 纯容器批量任务,无需管理EC2 |
| SQS+ASG | 低 | 极低 | 简单批量任务,追求低成本 |
内容的提问来源于stack exchange,提问作者arsh katyal
相关产品推荐
相关产品推荐

