CDK部署的AWS ECS Scheduled Task定时任务未执行无日志排查求助
1. 检查任务定义的日志配置
- Fargate默认不会自动把容器日志推送到CloudWatch Logs,需要显式配置日志驱动,确认你的CDK代码中
scheduledFargateTaskImageOptions下是否遗漏了相关配置,参考正确配置如下:
scheduledFargateTaskImageOptions: { image: ecs.ContainerImage.fromEcrRepository(ecrRepository, 'latest'), environment: {}, secrets: {}, // 新增日志驱动配置 logConfiguration: { logDriver: ecs.LogDriver.awsLogs({ streamPrefix: 'my-scheduler', logRetention: logs.RetentionDays.ONE_WEEK }) } }
2. 检查任务执行角色的权限
- 即使已经配置了ECR拉取权限,还需要确认任务执行角色拥有CloudWatch Logs的写入权限,对应需要的权限动作包括
logs:CreateLogStream、logs:PutLogEvents、logs:CreateLogGroup(如果配置为自动创建日志组)。如果使用CDK的awsLogs方法默认会自动附加对应权限,手动配置角色需要自行添加。
3. 检查CloudWatch Events目标配置是否完整
- 你在自定义Rule中直接将
mySchedulerTask作为EcsTask目标,可能存在配置缺失问题,默认直接传ScheduledFargateTask实例不会自动带入全部启动参数,会导致任务启动失败,正确的target配置参考如下:
targets: [new targets.EcsTask({ cluster: cluster, taskDefinition: mySchedulerTask.taskDefinition, subnetSelection: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, // 和原有任务的子网配置保持一致 securityGroups: mySchedulerTask.taskDefinition.defaultSecurityGroups, taskCount: 1 })]
4. 查看任务停止原因
- 进入ECS集群的「任务」tab,筛选「已停止」的任务,点击对应任务查看详情,停止原因会明确提示故障类型:比如镜像拉取失败、权限不足、资源不足、容器退出代码异常等,其中容器退出代码0代表正常执行完退出,代码1代表程序执行报错,代码137代表内存不足被强制终止。
5. 排查VPC网络问题
- 如果Fargate任务部署在私有子网,需要确认私有子网配置了NAT网关/ NAT实例,能够访问公网拉取ECR镜像、调用CloudWatch Logs接口;如果部署在公有子网,需要确认任务已经分配公网IP,否则无法访问公网服务导致任务启动失败。
额外注意事项
- 你当前的配置会导致任务每6小时执行1次+每天4个固定时间点执行,存在重复调度的问题,如果不需要重复调度可以删除
ScheduledFargateTask初始化参数中的schedule配置,只保留自定义的4个CloudWatch Rule即可。
内容的提问来源于stack exchange,提问作者Bikash Lama
相关产品推荐
相关产品推荐

