AWS ECS + Fargate 无服务器容器实战:从零部署你的第一个容器应用(2026最新教程)

📅 · AWS 国际版实战教程 - ChengziCloud

一句话结论

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 + EC2ECS + FargateEKS
是否需要管理服务器是(自建 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 月费
轻量 Web0.250.5 GB≈ $8.6≈ $2.6
标准 Web0.51 GB≈ $17.2≈ $5.2
中型应用12 GB≈ $34.4≈ $10.3
重计算24 GB≈ $68.8≈ $20.6
大内存48 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 更适合需要长时间运行、多容器协作的场景。

对比维度LambdaECS Fargate
最长执行时间15 分钟无限制
最大内存10 GB120 GB
最大 vCPU616
冷启动延迟有(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 vCPU0.5 GB - 2 GB0.5 GB≈ $8.6
0.5 vCPU1 GB - 4 GB1 GB≈ $17.2
1 vCPU2 GB - 8 GB2 GB≈ $34.4
2 vCPU4 GB - 16 GB4 GB≈ $68.8
4 vCPU8 GB - 30 GB8 GB≈ $137.6
8 vCPU16 GB - 60 GB16 GB≈ $275.2
16 vCPU32 GB - 120 GB32 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 选型决策树

还在纠结?用这个决策树快速判断:

  1. 团队有 K8s 经验吗? → 是 → EKS;否 → 继续
  2. 需要 K8s 生态(Helm、Operator)吗? → 是 → EKS;否 → 继续
  3. 需要管理超过 50 个微服务吗? → 是 → 考虑 EKS;否 → ECS
  4. 需要多集群联邦或混合云吗? → 是 → EKS;否 → ECS
  5. 预算有限、想快速上手? → 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 获取最新注册教程与专属优惠,助你轻松上云。

延伸阅读:

本文由 3.chengzicloud.cloud 提供,点击访问首页了解更多