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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:20:12