使用CDK部署EC2型ECS失败,求助解决实例调度报错
解决ECS部署报错"No Container Instances were found in your cluster"
你的核心问题是ECS集群没有可用的容器实例,原因在于自动扩缩容组(ASG)使用了普通的Amazon Linux镜像,未预装ECS容器代理,导致实例无法向ECS集群注册;同时实例缺少必要的IAM权限,也会阻碍注册流程。
修复步骤及代码修改
1. 使用ECS优化镜像
替换普通的AmazonLinuxImage为ECS官方优化镜像,该镜像预装了ECS代理、Docker及其他必要组件,能自动完成实例向集群的注册。
2. 添加ECS实例IAM角色
ECS实例需要权限与ECS控制平面通信、拉取ECR镜像、发送日志等,因此要给ASG实例附加AmazonEC2ContainerServiceforEC2Role托管策略。
修改后的完整代码
const vpc = new ec2.Vpc(this, 'PersonalWebsiteVpc', { maxAzs: 2, }); const cluster = new ecs.Cluster(this, 'PersonalWebsiteCluster', { vpc: vpc }); // 创建ECS实例所需的IAM角色 const ecsInstanceRole = new iam.Role(this, 'EcsInstanceRole', { assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerServiceforEC2Role') ] }); const autoScalingGroup = new autoscaling.AutoScalingGroup(this, 'ASG', { vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.SMALL), // 使用ECS优化的Amazon Linux 2镜像 machineImage: ecs.EcsOptimizedImage.amazonLinux2(), minCapacity: 1, maxCapacity: 2, // 指定实例角色 role: ecsInstanceRole }); const capacityProvider = new ecs.AsgCapacityProvider(this, 'AsgCapacityProvider', { autoScalingGroup: autoScalingGroup, }); cluster.addAsgCapacityProvider(capacityProvider); const repository = ecr.Repository.fromRepositoryName(this, 'MyRepository', 'my-personal-website-repo'); const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef'); const container = taskDefinition.addContainer('web', { image: ecs.ContainerImage.fromEcrRepository(repository, 'latest'), memoryLimitMiB: 1024, cpu: 512, }); container.addPortMappings({ containerPort: 80, hostPort: 80 }); new ecs.Ec2Service(this, 'EC2Service', { cluster, taskDefinition, });
额外排查点(若修改后仍有问题)
- 安全组配置:确保实例安全组允许出站HTTPS(443)访问,ECS代理需要通过该端口与ECS控制平面通信。
- 网络连通性:实例需能访问互联网(通过NAT网关或公网IP),以便拉取ECR镜像和与ECS服务通信。
- ECS代理日志:登录实例后查看
/var/log/ecs/ecs-agent.log,日志会明确指出注册失败的具体原因。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

