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

如何在AWS ECS上将任务关联到服务?CDK部署遇实例缺失报错

ECS服务创建失败:无可用容器实例问题解决

核心报错原因

was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide.

该报错的本质是ECS集群中没有成功注册的EC2容器实例,或实例无法满足任务调度要求,结合你的CDK代码,主要存在以下3个配置问题:


解决方案1:修正VPC网络配置

你的VPC设置了natGateways: 0,导致私有子网内的EC2实例无法访问公网,而ECS容器实例需要从AWS拉取ECS Agent、ECR镜像等资源,因此无法完成注册。

修改方案二选一:

方案A:添加NAT网关(推荐,适合生产环境)

const vpc = new ec2.Vpc(this, 'Vpc', {
  natGateways: 1, // 启用NAT网关,让私有子网实例能访问公网
  maxAzs: 2, // 指定可用区数量,提升服务可用性
});

方案B:让EC2实例部署在公有子网(适合测试环境)

cluster.addCapacity('Ec2Capacity', {
  instanceType: new ec2.InstanceType('t2.micro'),
  desiredCapacity: 1,
  minCapacity: 1,
  maxCapacity: 2,
  keyName: "elitereals",
  vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC } // 指定使用公有子网
});

解决方案2:降低容器内存限制

你使用的t2.micro实例总内存为1024MiB,而任务定义中设置memoryLimitMiB: 1024,会耗尽实例所有内存,导致ECS Agent(系统必需进程)无法运行,实例无法注册到集群。

修改容器内存限制为实例内存的一半左右:

const container = serverTaskDef.addContainer('DefaultContainer', {
  containerName: 'express-app-container',
  image: ecs.ContainerImage.fromDockerImageAsset(asset),
  memoryLimitMiB: 512, // 降低内存限制,预留空间给ECS Agent和系统进程
  logging: ecs.LogDrivers.awsLogs({
    streamPrefix: `express-app`
  }),
  portMappings: [
    {
      containerPort: 5000,
      hostPort: 0,
    },
  ],
});

解决方案3:确保EC2实例IAM权限足够

cluster.addCapacity默认创建的实例角色可能缺失部分权限,导致实例无法注册到ECS集群或拉取镜像。手动创建并指定具备完整权限的IAM角色:

// 创建ECS实例角色
const ecsInstanceRole = new iam.Role(this, 'ECSInstanceRole', {
  assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});
// 添加ECS实例必需的托管策略
ecsInstanceRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerServiceforEC2Role'));
// 可选:添加SSM权限,方便远程管理实例
ecsInstanceRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2RoleforSSM'));

// 在添加集群容量时指定该角色
cluster.addCapacity('Ec2Capacity', {
  instanceType: new ec2.InstanceType('t2.micro'),
  desiredCapacity: 1,
  minCapacity: 1,
  maxCapacity: 2,
  keyName: "elitereals",
  role: ecsInstanceRole, // 指定自定义实例角色
});

额外排查步骤

  • 登录AWS控制台,进入ECS集群的ECS实例标签页,确认是否有实例注册
  • 若没有注册实例,前往EC2控制台检查实例状态是否为running,公有子网实例是否有公网IP
  • 连接实例后执行docker ps,查看是否有ecs-agent容器在运行,若没有则查看系统日志定位问题

内容的提问来源于stack exchange,提问作者Exorcismus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:09