AWS ECS Scheduled Task经CI/CD发布后不运行,编辑保存后正常求助
问题根因定位
你的模板存在3处核心错误,直接导致定时任务无法自动触发:
- 两个定时规则使用了相同的CloudFormation资源逻辑ID
TaskSchedule,CloudFormation部署时同名逻辑ID的资源会被覆盖,最终只会创建最后定义的ass002规则,ass001规则不会被实际创建。 - 定时任务的执行角色配置错误:你给EventBridge规则的
RoleArn参数传的是ECSTaskExecutionRole,这个角色的信任主体只有ecs-tasks.amazonaws.com,仅用于ECS任务执行时拉取镜像、上报日志,没有给EventBridge服务调用ECS跑任务的权限。你在控制台编辑保存时,AWS会自动为EventBridge规则附加/修正对应的角色权限,所以保存后就正常运行了。 - 在
EcsParameters里硬编码了安全组sg-07db5ae6616a8c5fc和子网subnet-031d0787ad492c1c4的ID,没有引用模板内定义的ContainerSecurityGroup和子网资源,一旦重建VPC相关资源就会出现配置不匹配问题。 - 额外优化点:两个定时规则的Target ID都使用了相同的
dump-data-ecs-task,虽然不影响运行,但建议区分开避免后续维护混淆。
排查步骤
- 查看CloudFormation部署的事件日志,确认是否有重复资源ID的警告/错误,以及规则创建的状态。
- 打开EventBridge控制台,找到对应定时规则的「监控」标签,查看
Invocations和FailedInvocations指标,如果有调用失败,进一步查看规则的执行历史里的错误信息,大概率会提示角色没有权限执行ecs:RunTask。 - 查看
ECSTaskExecutionRole的信任策略,确认是否包含events.amazonaws.com的信任主体,正常情况下你刚部署完是没有的,控制台编辑后AWS会自动补上。
修复方案
1. 修正重复的资源逻辑ID
给两个定时规则分别设置不同的逻辑ID,比如TaskScheduleAss001和TaskScheduleAss002。
2. 新建专属的EventBridge调用ECS的角色
在模板的Resources里新增以下角色配置:
EventBridgeECSTriggerRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [events.amazonaws.com] Action: ["sts:AssumeRole"] Path: / Policies: - PolicyName: EventBridgeRunECSTaskPolicy PolicyDocument: Statement: - Effect: Allow Action: "ecs:RunTask" Resource: !Ref Task - Effect: Allow Action: "iam:PassRole" Resource: - !Ref ECSTaskExecutionRole Condition: StringLike: "iam:PassedToService": "ecs-tasks.amazonaws.com"
3. 修改定时规则的RoleArn配置
把两个定时规则里的RoleArn: !GetAtt ECSTaskExecutionRole.Arn替换为RoleArn: !GetAtt EventBridgeECSTriggerRole.Arn。
4. 替换硬编码的子网和安全组
把EcsParameters里硬编码的安全组和子网改成引用模板内的资源:
SecurityGroups: - !Ref ContainerSecurityGroup Subnets: - !Ref Subnet1 - !Ref Subnet2
修改完重新部署CloudFormation模板即可正常触发定时任务,不需要再手动在控制台编辑保存。
内容的提问来源于stack exchange,提问作者Andrea Cola
相关产品推荐
相关产品推荐

