AWS ECS 部署基础

ECS 是 AWS 的容器编排服务。它不像 Kubernetes 那样把所有概念都暴露出来,而是把容器运行抽象成 Cluster、Service、Task Definition、Task 这几层。

如果只是把一个后端服务稳定地跑起来,并接入 ALB、日志和自动扩缩容,ECS Fargate 是比自建 Kubernetes 更轻的选择。

1. ECS 的核心对象

ECS 的基本结构可以这样理解:

1
2
3
4
Cluster
└── Service
└── Task Definition
└── Task

1.1 Cluster

Cluster 是资源池和逻辑分组。常见划分方式:

维度示例
产品线ifonly-service-clusteragent-service-cluster
环境prod-clusterstaging-cluster
团队team-a-cluster

在 Fargate 模式下,Cluster 本身不是机器集群,不需要维护 EC2 节点。它更像一个承载 ECS 服务的逻辑容器。

1.2 Service

Service 负责保证指定数量的 Task 持续运行。比如设置 desired count 为 2,ECS 就会尽量保持两个 Task 存活。

Service 还可以绑定 Load Balancer,让新 Task 自动注册到 Target Group,旧 Task 下线时自动摘除。

1.3 Task Definition

Task Definition 是容器运行模板,描述镜像、CPU、内存、端口、环境变量、日志、IAM Role 等配置。

每次修改镜像版本或运行参数,通常都会生成一个新的 Task Definition revision。

1.4 Task

Task 是真正运行中的容器实例。Service 按 Task Definition 启动 Task,并持续维护它的数量和健康状态。

2. Task Network Mode

ECS 常见网络模式有 bridgeawsvpc。现代 Fargate 服务基本都使用 awsvpc

2.1 bridge 模式

bridge 模式可以类比合租公寓:

1
2
3
EC2 宿主机 IP: 10.0.1.100
├── 容器 A:宿主机 32768 -> 容器 8848
└── 容器 B:宿主机 32769 -> 容器 3000

容器没有独立 IP,需要通过宿主机端口转发。ALB 如果要访问容器,需要追踪 EC2 实例和动态端口,配置更复杂。

2.2 awsvpc 模式

awsvpc 模式可以类比独立门牌号:

1
2
3
EC2 宿主机 IP: 10.0.1.100
├── Task A:独立 ENI,IP 10.0.1.201:8848
└── Task B:独立 ENI,IP 10.0.1.202:3000

每个 Task 都有自己的 ENI 和私有 IP。ALB 可以直接按 IP 和端口转发流量,安全组也能绑定到 Task 级别。

结论:新服务优先使用 awsvpc,尤其是 Fargate。

3. Target Type 怎么选

创建 Target Group 时,Target Type 常见有四种:

Target Type含义适用场景
Instances按 EC2 实例 ID 和端口路由bridgehost 网络模式
IP addresses按 IP 地址和端口路由awsvpc 模式
Lambda function路由到 LambdaServerless 场景
Application Load Balancer路由到另一个 ALB多层负载均衡

awsvpc 模式下,Task 有独立私有 IP,不挂在 EC2 实例端口上,所以 Target Group 必须选 IP addresses

如果误选 Instances,ALB 只认识 EC2 实例,不知道 Task 的独立 IP,流量就无法正确送达容器。

4. Subnet 怎么判断

Subnet 是 VPC 里的一个网段,决定容器放在哪个网络区域。

1
2
3
VPC 10.228.0.0/16
├── 公有子网:路由到 Internet Gateway
└── 私有子网:路由到 NAT Gateway

判断一个子网是否公有,核心看路由表:

  • 0.0.0.0/0 -> igw-xxx:公有子网。
  • 0.0.0.0/0 -> nat-xxx:私有子网,可以出网但没有公网入口。
  • 没有默认路由:通常没有公网出网能力。

在 ECS 控制台可以进入 Service 的 Configuration and networking,查看它使用的 Subnet ID,再跳转到 VPC 控制台检查路由表。

5. ECS 如何自动注册 Target

ECS 自动注册 Target 的前提是 Service 配置了 loadBalancers,把 Service 和 Target Group 绑定起来。

如果 Target Group 里没有自动出现 Task,优先检查:

  1. ECS Service 的 Load balancing 区域是否为空。
  2. Target Group 类型是否与网络模式匹配。
  3. Container name、container port 是否与 Task Definition 一致。
  4. Health check path 是否能返回成功状态码。

只创建 Target Group 不够,必须在 ECS Service 创建或更新时绑定它。

6. HTTPS 证书配置

常见流程:

  1. 在 ACM 申请证书。
  2. 域名 DNS 验证通过。
  3. ALB 添加 HTTPS Listener,端口 443
  4. Listener 选择 ACM 证书。
  5. Route 53 或其他 DNS 服务把域名指向 ALB。

生产环境建议 HTTP 80 只做跳转,业务流量统一走 HTTPS。

7. 一条完整创建流程

从零搭一个典型 ECS Web 服务,大致顺序:

  1. 创建 ECR 仓库。
  2. 构建镜像并推送到 ECR。
  3. 创建 Task Definition。
  4. 创建 Target Group,awsvpc 对应 IP addresses
  5. 创建 ALB 和 Listener。
  6. 创建 ECS Service,并绑定 Target Group。
  7. 配置 Route 53 和 ACM 证书。

真正排查问题时,先看 Service events,再看 Target Group health check,最后看容器日志。大部分 ECS 部署问题都能在这三处定位。