使用Terraform创建ECS Fargate集群时遇容器实例未找到错误求助
问题原因与修复方案
核心错误
你的aws_ecs_service资源未指定Fargate启动类型,ECS服务默认使用EC2启动类型,这会导致AWS尝试在集群中寻找已注册的EC2容器实例,但你使用的是Fargate类型的任务定义(requires_compatibilities = ["FARGATE"]),两者模式不匹配,因此抛出"No container instances were found in your cluster"错误。
修复步骤
- 在
aws_ecs_service中添加launch_type = "FARGATE"配置,明确指定使用Fargate无服务器模式。 - (可选优化)移除容器定义中的
network_mode字段,Fargate任务的网络模式固定为awsvpc,容器会自动继承该配置,无需单独声明。 - (可选优化)在
portMappings中移除hostPort字段(或设为0),awsvpc模式下Fargate会自动处理端口映射,指定hostPort=80在Fargate环境中无实际意义。
修改后的完整配置
# Define each task resource "aws_ecs_task_definition" "my_task_definition" { family = "${var.service_name}-task" requires_compatibilities = ["FARGATE"] network_mode = "awsvpc" memory = "512" cpu = "256" container_definitions = jsonencode([ { name = "${var.service_name}-task" image = "ealen/echo-server" portMappings = [ { containerPort = 80 } ] } ]) } # Create a service that manages the tasks resource "aws_ecs_service" "my_service" { name = "${var.service_name}-service" cluster = aws_ecs_cluster.my_cluster.id task_definition = aws_ecs_task_definition.my_task_definition.arn desired_count = 1 # 新增:指定Fargate启动类型 launch_type = "FARGATE" load_balancer { target_group_arn = aws_lb_target_group.my_ecs_targetgroup.arn container_name = "${var.service_name}-task" container_port = 80 } network_configuration { security_groups = [aws_security_group.my_ecs_security_group.id] subnets = aws_subnet.my_private_subnet.*.id # 若私有子网未配置NAT网关,需设为ENABLED让任务获取公网IP拉取镜像 assign_public_ip = "ENABLED" } depends_on = [aws_lb_listener.my_lb_listener] }
额外注意事项
如果任务部署在私有子网中,需确保子网配置了NAT网关,否则任务无法拉取公网镜像;若未配置NAT网关,必须将assign_public_ip设为ENABLED,让任务通过公网IP获取镜像。
内容的提问来源于stack exchange,提问作者VBoi
相关产品推荐
相关产品推荐

