Terraform创建AWS ECS任务集报empty output错误排查
问题根因
你遇到的任务无法调度、TaskSet创建报错是多个配置错误叠加导致的:
- 核心基础配置缺失:ECS集群没有任何已注册的EC2容器实例,EC2启动类型没有可用计算资源,根本无法调度任务
- Terraform资源冲突:你已经在
aws_ecs_service中指定了任务定义、启动类型、期望副本数,服务创建时会自动生成主TaskSet,再单独声明aws_ecs_task_set资源会触发调度逻辑冲突,AWS API返回非预期空响应,最终抛出error creating ECS TaskSet: empty output错误 - 任务定义配置错误:使用的官方
hello-world镜像为一次性测试镜像,启动后打印日志就会退出,不会常驻监听80端口;同时配置的cpu=1仅为0.001vCPU算力,远低于容器运行的最低要求 - 无效参数配置:
network_configuration里的assign_public_ip参数仅对Fargate启动类型生效,EC2启动类型下该参数无效,公网IP需要在EC2实例网卡层面配置
分步修复方案
1. 补全EC2容器实例配置,完成集群注册
没有可用的EC2容器实例是任务无法运行的核心原因,按以下步骤配置:
- 选择Amazon ECS Optimized版Amazon Linux 2 AMI创建EC2启动模板,该镜像默认预装ECS容器代理,不需要手动安装
- 给EC2实例绑定的IAM实例角色附加
AmazonEC2ContainerServiceforEC2Role托管策略,授予容器代理和ECS控制面通信的权限 - 在EC2启动模板的用户数据中添加集群注册配置:
#!/bin/bash echo "ECS_CLUSTER=${aws_ecs_cluster.ecs.name}" >> /etc/ecs/ecs.config
- 配置EC2实例安全组:入方向放开80端口供负载均衡访问,出方向放开443端口供容器代理连接ECS控制面
- 创建自动扩缩组挂载上述启动模板,设置最小实例数≥2,等实例启动完成后,ECS控制台集群页面的「容器实例」 tab 下可以看到状态为
Active的实例,才算完成计算资源准备
2. 移除冲突的TaskSet资源
直接删除你写的aws_ecs_task_set资源块:普通REPLICA调度策略的ECS服务不需要单独管理TaskSet,仅当你需要做蓝绿部署、使用自定义外部部署控制器时才需要单独声明该资源。重复创建TaskSet会和服务原生调度逻辑冲突,直接导致你看到的空输出报错。
3. 修正任务定义配置
调整镜像、资源配置,保证容器可以常驻运行:
resource "aws_ecs_task_definition" "service" { family = "service" container_definitions = jsonencode([ { name = "first" image = "nginx:alpine" # 替换为常驻监听80端口的web镜像,你可以基于这个镜像自定义hello-world页面内容 cpu = 256 # 对应0.25vCPU,满足web服务最低运行要求 memory = 512 essential = true portMappings = [ { containerPort = 80 hostPort = 0 # 设置为0让Docker自动分配宿主临时端口,避免多任务同实例时的80端口冲突,ECS会自动同步端口映射到目标组 } ] } ]) task_role_arn = "arn:aws:iam::753392824297:role/segev-role-ecs" }
4. 调整ECS Service配置
给服务添加依赖关系,等EC2实例节点组部署完成后再调度服务,修正后配置如下:
resource "aws_ecs_service" "scale" { name = "test" cluster = aws_ecs_cluster.ecs.id desired_count = 2 task_definition = aws_ecs_task_definition.service.arn scheduling_strategy = "REPLICA" launch_type = "EC2" load_balancer { target_group_arn = aws_lb_target_group.foo.arn container_name = "first" container_port = 80 } depends_on = [aws_autoscaling_group.ecs_nodes] }
5. 验证部署结果
- 执行
terraform apply完成资源更新 - 先确认ECS集群下有≥2个状态为
Active的容器实例 - 再查看服务下的任务列表,2个任务会从
PENDING状态转为RUNNING状态 - 等待负载均衡目标组的健康检查通过后,访问ALB的公网DNS地址即可看到web页面,后续可以替换镜像内容为你需要的hello-world页面。
内容的提问来源于stack exchange,提问作者xshonlevix
相关产品推荐
相关产品推荐

