使用AWS CDK部署EC2类型ECS服务时遇容器实例未找到错误
解决ECS EC2集群提示“No Container Instances were found in your cluster”的问题
我尝试用AWS CDK将FastAPI应用部署为ECS EC2类型服务时,碰到错误:No Container Instances were found in your cluster,哪怕用官方示例代码也会出现同样问题。我的CDK代码如下:
from pathlib import Path from aws_cdk import ( aws_autoscaling as autoscaling, aws_ec2 as ec2, aws_ecs as ecs, App, Stack, ) app = App() stack = Stack( app, "sample-aws-ec2-integ-ecs", env={"region": "ap-south-1", "account": "xxxxxxxxx"}, ) # 引用现有VPC vpc = ec2.Vpc.from_lookup(stack, "dev-vpc", vpc_id="vpc-xxxxxxxx") # 创建ECS集群并启用容器洞察 cluster = ecs.Cluster(stack, "EcsCluster", vpc=vpc, container_insights=True) # 引用现有安全组 web_server_sg = ec2.SecurityGroup.from_security_group_id( stack, "Dev-Pub-SG", security_group_id="sg-xxxxxxxx" ) # 创建自动扩缩容组 auto_scaling_group = autoscaling.AutoScalingGroup( stack, "asg", vpc=vpc, instance_type=ec2.InstanceType("t2.micro"), machine_image=ecs.EcsOptimizedImage.amazon_linux2(), security_group=web_server_sg, associate_public_ip_address=True, vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC), key_name="asg-key", desired_capacity=1, ) # 创建容量提供者并关联到集群 capacity_provider = ecs.AsgCapacityProvider( stack, "capacity_provider", auto_scaling_group=auto_scaling_group ) cluster.add_asg_capacity_provider(provider=capacity_provider) # 创建EC2任务定义 task_definition = ecs.Ec2TaskDefinition(stack, "TaskDef") # 添加容器,使用本地镜像 container = task_definition.add_container( "web", image=ecs.AssetImage(str(Path(".").resolve().parent)), memory_limit_mib=512 ) # 配置端口映射 port_mapping = ecs.PortMapping( container_port=8000, host_port=8000, protocol=ecs.Protocol.TCP ) container.add_port_mappings(port_mapping) # 创建ECS服务 service = ecs.Ec2Service( stack, "Service", cluster=cluster, task_definition=task_definition, desired_count=1 ) app.synth()
排查与修复步骤
1. 检查安全组出站规则
ECS Agent需要和ECS控制平面通信,你的Dev-Pub-SG安全组必须允许以下出站流量:
- TCP 443:用于调用ECS API
- TCP 51678:ECS Agent与控制平面的通信端口
如果安全组没开这些规则,直接在CDK里添加:
# 给安全组添加必要的出站规则 web_server_sg.add_egress_rule(ec2.Peer.any_ipv4(), ec2.Port.tcp(443)) web_server_sg.add_egress_rule(ec2.Peer.any_ipv4(), ec2.Port.tcp(51678))
2. 确认实例角色权限
ASG创建的EC2实例必须拥有AmazonEC2ContainerServiceforEC2Role权限,否则ECS Agent无法向集群注册实例。
如果已有该角色,直接在ASG中指定:
import aws_cdk.aws_iam as iam ecs_instance_role = iam.Role.from_role_name(stack, "EcsInstanceRole", role_name="AmazonEC2ContainerServiceforEC2Role") # 修改ASG定义,添加role参数 auto_scaling_group = autoscaling.AutoScalingGroup( stack, "asg", # 其他参数不变 role=ecs_instance_role, )
如果没有这个角色,先创建:
ecs_instance_role = iam.Role(stack, "EcsInstanceRole", assumed_by=iam.ServicePrincipal("ec2.amazonaws.com"), managed_policies=[ iam.ManagedPolicy.from_aws_managed_policy_name("AmazonEC2ContainerServiceforEC2Role") ] )
3. 验证子网路由配置
公有子网必须有指向Internet Gateway的路由(0.0.0.0/0 -> IGW),否则实例连不上ECS控制平面。去VPC控制台检查对应子网的路由表配置。
4. 检查实例注册状态
实例启动后,ECS Agent需要几分钟才能完成注册。可以通过两种方式确认:
- 登录ECS控制台,查看集群的「ECS实例」标签页是否有实例
- 登录EC2实例,查看Agent日志:
sudo cat /var/log/ecs/ecs-agent.log,搜索是否有Registered container instance相关日志
5. 调整CDK依赖顺序
如果服务创建时容量提供者还没完全关联,可能导致服务启动时实例未就绪。可以给服务添加依赖:
service.node.add_dependency(capacity_provider)
内容的提问来源于stack exchange,提问作者c__c
相关产品推荐
相关产品推荐

