AWS ECS + Fargate 无服务器容器实战:从零部署你的第一个容器应用(2026最新教程)
Meta Description: AWS ECS Fargate 实战教程,手把手教你在 AWS 上部署无服务器容器应用。
- 前言
- ECS vs EKS vs EC2:三大容器方案怎么选
- Fargate 到底怎么收费:定价模型详解
- 控制台实操:10 分钟部署第一个 Fargate 容器
- CLI 部署全流程:一键部署脚本
- ECS + Fargate vs Lambda:什么时候该用容器
- ECS 服务发现与负载均衡:生产级部署
- ECS 监控与日志:CloudWatch 全家桶
Meta Description: AWS ECS Fargate 实战教程,手把手教你在 AWS 上部署无服务器容器应用。包含 ECS vs EKS 选型对比、Fargate 价格计算、CLI+控制台双套操作、5 个省钱技巧。
关键词: AWS ECS、AWS Fargate、ECS vs EKS、无服务器容器、AWS 容器服务、ECS 部署教程
前言
很多开发者用过 Lambda 做无服务器函数,但当应用需要跑 Docker 容器、有状态服务或者多容器协作时,Lambda 就不够用了。AWS 提供了两大容器编排服务:ECS(Elastic Container Service) 和 EKS(Elastic Kubernetes Service)。其中 ECS + Fargate 的组合,让你不用管理服务器,直接跑容器——真正的"无服务器容器"。
决策口诀: 简单容器用 ECS Fargate,需要 K8s 生态用 EKS,两者都能免运维基础设施。
一、ECS vs EKS vs EC2:三大容器方案怎么选
AWS 的容器服务看起来很多,但核心就三条路线,搞清楚区别就不会选错。
| 对比维度 | ECS + EC2 | ECS + Fargate | EKS |
|---|---|---|---|
| 是否需要管理服务器 | 是(自建 EC2 集群) | 否(完全托管) | 是(控制面托管,工作节点自建) |
| 学习曲线 | 中等 | 低(最简单) | 高(需要 K8s 知识) |
| 适合场景 | 有经验的团队,需要精细控制 | 中小项目、快速上手 | 大规模微服务、需要 K8s 生态 |
| 按需计费 | EC2 按实例计费 | 按 vCPU + 内存计费 | EC2 按实例 + EKS 控制面 $0.10/h |
| 最低费用 | 约 $30/月(t3.small) | 约 $8/月(0.25vCPU+0.5GB) | 约 $73/月(m5.large+控制面) |
| 最大节点数 | 2000 | 无限制 | 5000 |
2026 年新趋势: AWS 在 2025 年底推出了 Fargate Spot,按需价格的 70% 运行容器(类似 EC2 Spot),适合无状态、可中断的任务。这进一步降低了 Fargate 的成本门槛,让更多中小团队能用得起容器化部署方案。
二、Fargate 到底怎么收费:定价模型详解
Fargate 的计费非常简单——按你容器实际使用的 vCPU 和内存时长收费,不用预付,用多少付多少。这种按量付费模式让开发者无需提前采购服务器资源,也无需担心资源浪费。
Fargate 价格表(us-east-1 区域,2026 年参考价)
| 资源 | 按需价格 | Fargate Spot 价格 | 1 年承诺折扣 |
|---|---|---|---|
| vCPU 每小时 | $0.04048 | $0.01214(约 70% off) | 约 20% off |
| GB 内存每小时 | $0.004445 | $0.001334(约 70% off) | 约 20% off |
常见容器配置月费估算
| 容器配置 | vCPU | 内存 | 按需月费 | Spot 月费 |
|---|---|---|---|---|
| 轻量 Web | 0.25 | 0.5 GB | ≈ $8.6 | ≈ $2.6 |
| 标准 Web | 0.5 | 1 GB | ≈ $17.2 | ≈ $5.2 |
| 中型应用 | 1 | 2 GB | ≈ $34.4 | ≈ $10.3 |
| 重计算 | 2 | 4 GB | ≈ $68.8 | ≈ $20.6 |
| 大内存 | 4 | 8 GB | ≈ $137.6 | ≈ $41.2 |
计算公式:月费 = (vCPU 单价 × 数量 × 730 小时) + (内存单价 × GB 数 × 730 小时)
💡 省钱提示: Fargate Spot 适合无状态 Web 服务、后台任务、CI/CD 构建等可中断的工作负载。有状态服务(数据库、持久化队列)不建议用 Spot。
三、控制台实操:10 分钟部署第一个 Fargate 容器
3.1 前置准备
// 安装 AWS CLI v2(如果还没装)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip && sudo ./aws/install
// 配置凭证
aws configure
// 输入 Access Key ID、Secret Access Key、Region(建议 us-east-1)、输出格式 json
3.2 创建 ECR 仓库并推送镜像
// 创建 ECR 仓库
aws ecr create-repository --repository-name my-first-app --region us-east-1
// 登录 ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
// 构建并推送镜像(示例用 nginx)
docker pull nginx:alpine
docker tag nginx:alpine 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-first-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-first-app:latest
3.3 创建 ECS 集群
// 创建 Fargate 集群(无 EC2 实例)
aws ecs create-cluster --cluster-name my-fargate-cluster --region us-east-1
3.4 定义任务(Task Definition)
// 用 JSON 文件定义任务
cat > task-def.json << 'EOF'
{
"family": "my-first-task",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "web",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-first-app:latest",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"essential": true
}
]
}
EOF
// 注册任务定义
aws ecs register-task-definition --cli-input-json file://task-def.json --region us-east-1
3.5 创建服务并部署
// 先创建安全组(允许 80 端口)
VPC_ID=$(aws ec2 describe-vpcs --filters "Name=isDefault,Values=true" --query "Vpcs[0].VpcId" --output text --region us-east-1)
SG_ID=$(aws ec2 create-security-group --group-name fargate-sg --description "Fargate SG" --vpc-id $VPC_ID --query "GroupId" --output text --region us-east-1)
aws ec2 authorize-security-group-ingress --group-id $SG_ID --protocol tcp --port 80 --cidr 0.0.0.0/0 --region us-east-1
// 获取子网
SUBNETS=$(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC_ID" --query "Subnets[*].SubnetId" --output text --region us-east-1)
// 创建服务
aws ecs create-service \
--cluster my-fargate-cluster \
--service-name my-web-service \
--task-definition my-first-task:1 \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[$SUBNETS],securityGroups=[$SG_ID],assignPublicIp=ENABLED}" \
--region us-east-1
3.6 验证部署
// 查看服务状态
aws ecs describe-services --cluster my-fargate-cluster --services my-web-service --region us-east-1
// 获取公网 IP(通过 ELB)
aws elbv2 describe-load-balancers --region us-east-1
// 用浏览器访问 ELB 的 DNS 名称即可看到 nginx 欢迎页
🚀 需要 AWS 国际版账号?通过 3.chengzicloud.cloud 获取最新注册教程与专属优惠,助你轻松上云。
四、CLI 部署全流程:一键部署脚本
手动操作适合学习,但生产环境推荐用脚本自动化。以下是一个完整的 Fargate 部署脚本,涵盖了从镜像构建到服务部署的全部步骤:
#!/bin/bash
// deploy-fargate.sh — 一键部署 Fargate 服务
set -e
REGION="us-east-1"
CLUSTER="production-cluster"
SERVICE="web-app"
REPO="my-app"
TASK_FAMILY="web-app-task"
IMAGE_TAG="latest"
CPU="512"
MEMORY="1024"
DESIRED_COUNT=2
// 获取默认 VPC 和子网
VPC_ID=$(aws ec2 describe-vpcs --filters "Name=isDefault,Values=true" \
--query "Vpcs[0].VpcId" --output text --region $REGION)
SUBNETS=$(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC_ID" \
--query "Subnets[*].SubnetId" --output text --region $REGION)
SG_ID=$(aws ec2 create-security-group --group-name ${SERVICE}-sg \
--description "${SERVICE} security group" --vpc-id $VPC_ID \
--query "GroupId" --output text --region $REGION 2>/dev/null || \
aws ec2 describe-security-groups --filters "Name=group-name,Values=${SERVICE}-sg" \
--query "SecurityGroups[0].GroupId" --output text --region $REGION)
aws ec2 authorize-security-group-ingress --group-id $SG_ID \
--protocol tcp --port 80 --cidr 0.0.0.0/0 --region $REGION 2>/dev/null || true
// 推送镜像
aws ecr get-login-password --region $REGION | \
docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com
docker build -t ${REPO}:${IMAGE_TAG} .
docker tag ${REPO}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:${IMAGE_TAG}
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:${IMAGE_TAG}
// 更新任务定义
TASK_DEF=$(cat <<EOF
{
"family": "${TASK_FAMILY}",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "${CPU}",
"memory": "${MEMORY}",
"executionRoleArn": "arn:aws:iam::${AWS_ACCOUNT_ID}:role/ecsTaskExecutionRole",
"containerDefinitions": [{
"name": "app",
"image": "${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:${IMAGE_TAG}",
"portMappings": [{"containerPort": 80, "protocol": "tcp"}],
"essential": true
}]
}
EOF
)
aws ecs register-task-definition --cli-input-json "$TASK_DEF" --region $REGION
// 部署服务
aws ecs create-service --cluster $CLUSTER --service-name $SERVICE \
--task-definition ${TASK_FAMILY} --desired-count $DESIRED_COUNT \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[$SUBNETS],securityGroups=[$SG_ID],assignPublicIp=ENABLED}" \
--region $REGION 2>/dev/null || \
aws ecs update-service --cluster $CLUSTER --service $SERVICE \
--task-definition ${TASK_FAMILY} --desired-count $DESIRED_COUNT --region $REGION
echo "✅ 部署完成!等待服务稳定..."
aws ecs wait services-stable --cluster $CLUSTER --services $SERVICE --region $REGION
echo "✅ 服务已就绪"
五、ECS + Fargate vs Lambda:什么时候该用容器
很多人纠结"用 Lambda 还是 Fargate",其实两者适用场景差异很大。Lambda 擅长事件驱动的短任务,而 Fargate 更适合需要长时间运行、多容器协作的场景。
| 对比维度 | Lambda | ECS Fargate |
|---|---|---|
| 最长执行时间 | 15 分钟 | 无限制 |
| 最大内存 | 10 GB | 120 GB |
| 最大 vCPU | 6 | 16 |
| 冷启动延迟 | 有(100ms-数秒) | 无(常驻运行) |
| 并发模型 | 每请求一个实例 | 容器级别控制 |
| 适合场景 | 事件驱动、短任务 | 长连接、WebSocket、有状态 |
| 多容器支持 | 不支持 | 支持 sidecar |
| Docker 兼容性 | 有限(必须适配 Lambda 运行时) | 完全兼容 |
| 长连接/WebSocket | 不支持 | 完全支持 |
| 月费起步 | 免费额度内 $0 | ≈ $8/月 |
典型选型决策:
- API Gateway + 短任务 → Lambda
- 微服务 + 持续运行 → ECS Fargate
- WebSocket / SSE 长连接 → ECS Fargate
- 定时任务 + 数据处理 → Lambda(<15 分钟)或 Fargate(>15 分钟)
- 需要 GPU 推理 → Fargate(支持 GPU)或 EC2
六、ECS 服务发现与负载均衡:生产级部署
生产环境的 ECS 服务通常需要配合 ALB(Application Load Balancer)做流量分发,以及用 Cloud Map 做服务间通信。这是从开发环境走向生产环境的关键一步。
6.1 配置 ALB 负载均衡
// 创建 ALB
ALB_ARN=$(aws elbv2 create-load-balancer \
--name my-app-alb \
--subnets $SUBNETS \
--security-groups $SG_ID \
--scheme internet-facing \
--type application \
--query "LoadBalancers[0].LoadBalancerArn" \
--output text --region $REGION)
// 创建目标组(Target Group)
TG_ARN=$(aws elbv2 create-target-group \
--name my-app-tg \
--protocol HTTP --port 80 \
--vpc-id $VPC_ID \
--target-type ip \
--health-check-path "/" \
--health-check-interval-seconds 30 \
--query "TargetGroups[0].TargetGroupArn" \
--output text --region $REGION)
// 创建监听器
aws elbv2 create-listener \
--load-balancer-arn $ALB_ARN \
--protocol HTTP --port 80 \
--default-actions Type=forward,TargetGroupArn=$TG_ARN \
--region $REGION
// 更新服务,关联 ALB
aws ecs update-service \
--cluster $CLUSTER \
--service $SERVICE \
--load-balancers "targetGroupArn=$TG_ARN,containerName=app,containerPort=80" \
--region $REGION
6.2 Cloud Map 服务发现
// 创建私有命名空间
NAMESPACE_ID=$(aws servicediscovery create-private-dns-namespace \
--name local \
--vpc $VPC_ID \
--query "Namespace.Id" --output text --region $REGION)
// 创建服务注册
aws servicediscovery create-service \
--name web-app \
--namespace-id $NAMESPACE_ID \
--query "Service.Arn" --output text --region $REGION
七、ECS 监控与日志:CloudWatch 全家桶
Fargate 不像 EC2 可以 SSH 进去排查问题,所以监控和日志尤为重要。CloudWatch 是 AWS 原生的监控解决方案,能帮你追踪容器的 CPU、内存、网络等关键指标。
7.1 开启容器日志
// 在任务定义中添加日志配置
// containerDefinitions 中加入:
// "logConfiguration": {
// "logDriver": "awslogs",
// "options": {
// "awslogs-group": "/ecs/my-app",
// "awslogs-region": "us-east-1",
// "awslogs-stream-prefix": "ecs",
// "awslogs-create-group": "true"
// }
// }
// 创建日志组
aws logs create-log-group --log-group-name /ecs/my-app --region $REGION
7.2 设置 CPU/内存告警
// 当 CPU 使用率 > 80% 时告警
aws cloudwatch put-metric-alarm \
--alarm-name "ECS-High-CPU" \
--metric-name "CPUUtilization" \
--namespace "AWS/ECS" \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=ClusterName,Value=$CLUSTER Name=ServiceName,Value=$SERVICE \
--evaluation-periods 2 \
--alarm-actions "arn:aws:sns:us-east-1:123456789012:ops-alerts" \
--region $REGION
八、5 个 Fargate 省钱技巧
1. 用 Fargate Spot 替代按需实例
// 在服务中启用 Spot
aws ecs create-service \
--cluster $CLUSTER \
--service-name spot-worker \
--task-definition my-task \
--capacity-provider-strategy "capacityProvider=FARGATE_SPOT,weight=1" \
--region $REGION
2. 自动缩容到 0(不跑空车)
// 配置 Application Auto Scaling
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/$CLUSTER/$SERVICE \
--min-capacity 0 --max-capacity 10 \
--region $REGION
// 配置基于 CPU 的缩放策略
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/$CLUSTER/$SERVICE \
--policy-name cpu-target-tracking \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration "{
\"TargetValue\": 70.0,
\"PredefinedMetricSpecification\": {
\"PredefinedMetricType\": \"ECSServiceAverageCPUUtilization\"
}
}" \
--region $REGION
3. 合理设置 CPU/内存配比
Fargate 要求 CPU 和内存必须匹配特定配比。不要过度分配——按实际需求选择最小匹配项,避免浪费资源。
| CPU | 可选内存范围 | 推荐 | 月费(按需) |
|---|---|---|---|
| 0.25 vCPU | 0.5 GB - 2 GB | 0.5 GB | ≈ $8.6 |
| 0.5 vCPU | 1 GB - 4 GB | 1 GB | ≈ $17.2 |
| 1 vCPU | 2 GB - 8 GB | 2 GB | ≈ $34.4 |
| 2 vCPU | 4 GB - 16 GB | 4 GB | ≈ $68.8 |
| 4 vCPU | 8 GB - 30 GB | 8 GB | ≈ $137.6 |
| 8 vCPU | 16 GB - 60 GB | 16 GB | ≈ $275.2 |
| 16 vCPU | 32 GB - 120 GB | 32 GB | ≈ $550.4 |
4. 用 ECR 生命周期策略清理旧镜像
// 只保留最近 10 个镜像,删除 30 天前的
aws ecr put-lifecycle-policy \
--repository-name my-app \
--lifecycle-policy-text '{
"rules": [
{
"rulePriority": 1,
"description": "Keep last 10 images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {"type": "expire"}
}
]
}' \
--region $REGION
5. 利用 Compute Savings Plans
Fargate 支持 Compute Savings Plans——承诺 1 年或 3 年的使用量,获得 20%-50% 的折扣。如果你的 Fargate 使用量稳定,这是最直接的省钱方式,效果类似于 EC2 的预留实例。
// 查看 Savings Plans 购买建议
aws savingsplans describe-savings-plans-offerings \
--instance-type-contents '[{"instanceType":"FARGATE"}]' \
--region us-east-1
九、常见部署问题排查
问题 1:任务一直 Pending
原因: 通常是子网没有可用 IP,或者安全组配置错误。Fargate 需要子网中有足够的可用 IP 地址来分配给每个任务,如果子网太小或者 IP 耗尽,任务就无法启动。
// 检查任务停止原因
aws ecs describe-tasks --cluster $CLUSTER --tasks $TASK_ID --region $REGION \
--query "tasks[0].containers[0].reason"
问题 2:健康检查失败
原因: 容器内的应用没有在端口上监听,或者 health check path 不正确。最常见的错误是应用监听了 127.0.0.1 而不是 0.0.0.0,导致 ALB 无法访问。
// 查看目标组健康状态
aws elbv2 describe-target-health --target-group-arn $TG_ARN --region $REGION
问题 3:日志看不到输出
原因: awslogs 驱动配置错误,或日志组不存在。确保任务执行角色(ecsTaskExecutionRole)有写入 CloudWatch Logs 的权限。
// 验证日志组
aws logs describe-log-groups --log-group-name-prefix /ecs/my-app --region $REGION
// 查看最新日志流
aws logs describe-log-streams --log-group-name /ecs/my-app \
--order-by LastEventTime --descending --limit 5 --region $REGION
十、ECS vs EKS 选型决策树
还在纠结?用这个决策树快速判断:
- 团队有 K8s 经验吗? → 是 → EKS;否 → 继续
- 需要 K8s 生态(Helm、Operator)吗? → 是 → EKS;否 → 继续
- 需要管理超过 50 个微服务吗? → 是 → 考虑 EKS;否 → ECS
- 需要多集群联邦或混合云吗? → 是 → EKS;否 → ECS
- 预算有限、想快速上手? → ECS + Fargate(最低 $8/月)
总结: 80% 的用户选 ECS + Fargate 就够了。除非你明确需要 K8s 的扩展性和生态,否则不要给自己增加学习负担。AWS 的 ECS 正在快速迭代,2026 年已经支持 Fargate Spot、GPU 实例和更灵活的网络配置。
常见问题(FAQ)
ECS Fargate 最低需要多少钱?
0.25 vCPU + 0.5 GB 内存的配置,按需价格约 $8.6/月。如果用 Fargate Spot,约 $2.6/月。
Fargate 和 Lambda 怎么选?
Lambda 适合事件驱动的短任务(<15 分钟),Fargate 适合需要长时间运行、多容器协作、WebSocket 长连接的场景。
Fargate 能跑 GPU 吗?
可以。AWS 在 2024 年推出了 Fargate GPU 支持(NVIDIA T4),适合轻量推理任务。重度 GPU 需求建议用 EC2 P 系列。
ECS 和 EKS 哪个更适合生产环境?
两者都适合。ECS + Fargate 更简单,运维成本低;EKS 功能更强大,但需要 Kubernetes 运维经验。中小团队推荐 ECS。
Fargate Spot 会被抢占吗?
会。AWS 会在容量紧张时回收 Spot 实例,通常提前 2 分钟通知。适合无状态、可自动恢复的服务,不适合有状态应用。
如何监控 Fargate 容器的资源使用?
通过 CloudWatch Container Insights 可以看到 CPU、内存、网络、磁盘等指标。启用方式:在集群上开启 Container Insights 功能。
⚠️ 文中价格为 2026 年参考价,实际费用随区域和官方调价变动,请以 AWS 官网为准。
🚀 需要 AWS 国际版账号?通过 3.chengzicloud.cloud 获取最新注册教程与专属优惠,助你轻松上云。
延伸阅读:
- AWS Lambda 无服务器实战:从 0 搭建 API
- AWS Lightsail vs EC2:轻量应用 vs 弹性计算选哪个
- AWS EC2 选购教程:实例类型/预留实例/Spot 实例省钱攻略
本文由 3.chengzicloud.cloud 提供,点击访问首页了解更多