You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:48:22