AWS ECS生产环境部署,从开发测试到上线的完整流程
上一篇文章我们讲了用ECS Fargate跑一个简单的Flask应用。但生产环境要求更高:要有多副本保证高可用,要有日志收集方便排查问题,要有监控告警第一时间发现故障。这篇文章带你走一遍生产环境部署的完整流程。
一、生产环境的基本要求
开发环境只要跑起来就行,生产环境要满足:
高可用:至少两个副本,分布在不同的可用区
自动恢复:容器挂了能自动重启
日志集中:所有日志收集到一起,方便查
监控告警:CPU高了、内存满了能及时知道
零停机更新:更新应用时用户无感知
二、第一步:准备生产环境基础设施
2.1 创建VPC和子网
生产环境应该用独立的VPC,至少两个可用区:
公有子网A:用于负载均衡器
公有子网B:用于负载均衡器
私有子网A:用于ECS任务
私有子网B:用于ECS任务
负载均衡器放在公有子网,ECS任务放在私有子网,更安全。
2.2 创建安全组
创建三个安全组:
负载均衡器安全组:
入站:允许80和443来自0.0.0.0/0
出站:允许所有
ECS任务安全组:
入站:只允许来自负载均衡器安全组的流量(应用端口)
出站:允许所有
数据库安全组(如果有):
入站:只允许来自ECS任务安全组的流量(数据库端口)
出站:允许所有
2.3 创建负载均衡器
创建Application Load Balancer:
面向互联网
选择两个公有子网
安全组选负载均衡器安全组
创建目标组,健康检查路径设为应用的健康检查端点(比如/health)
三、第二步:配置任务定义
3.1 基础配置
json
复制下载
{ "family": "my-app-prod", "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "cpu": "512", "memory": "1024", "executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole", "taskRoleArn": "arn:aws:iam::xxx:role/ecsTaskRole", "containerDefinitions": [ { "name": "app", "image": "xxx.dkr.ecr.us-east-1.amazonaws.com/my-app:latest", "portMappings": [{"containerPort": 8080}], "environment": [ {"name": "DB_HOST", "value": "xxx.rds.amazonaws.com"}, {"name": "DB_NAME", "value": "myapp"}, {"name": "ENVIRONMENT", "value": "production"} ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/my-app", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "app" } }, "healthCheck": { "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"], "interval": 30, "timeout": 5, "retries": 3 } } ]}
关键配置说明:
cpu和memory:根据应用实际需求设置,不要太低也不要太高
environment:数据库地址、环境变量等,敏感信息应该用Secrets Manager存
logConfiguration:日志发送到CloudWatch Logs
healthCheck:ECS用它判断容器是否健康,不健康会自动重启
四、第三步:创建服务
4.1 创建ECS服务
在ECS集群里创建服务:
启动类型:Fargate
任务定义:选生产版本
服务名称:my-app-prod-service
期望任务数:2(至少两个副本)
部署类型:滚动更新(默认)
4.2 配置网络
VPC:选你的生产VPC
子网:选两个私有子网(不同可用区)
安全组:选ECS任务安全组
4.3 配置负载均衡
负载均衡器类型:Application Load Balancer
负载均衡器名称:选你创建的
容器端口:8080
目标组:选你创建的
4.4 配置自动扩缩
最小任务数:2
最大任务数:10
扩缩策略:基于CPU使用率,目标值70%
这样当CPU超过70%时,ECS会自动增加任务数。
五、第四步:配置日志和监控
5.1 创建CloudWatch日志组
在CloudWatch控制台创建日志组:/ecs/my-app。设置保留期,比如30天。
5.2 配置CloudWatch告警
创建几个关键告警:
CPU过高告警:
指标:ECS服务CPU利用率
条件:大于80%持续5分钟
动作:发送邮件到运维团队
任务数异常:
指标:RunningTaskCount
条件:小于2(低于最小副本数)或大于10(超过最大)
动作:发送告警
服务中断:
指标:服务状态
条件:服务状态不是ACTIVE
动作:紧急告警
5.3 配置仪表板
在CloudWatch创建仪表板,展示:
CPU利用率
内存利用率
运行任务数
请求数
错误率
方便一眼看到系统状态。
六、第五步:零停机更新
6.1 更新应用代码
修改代码后,构建新镜像,推送到ECR,打上新标签(比如v2)。
6.2 更新任务定义
创建新版本的任务定义,指向新镜像。
6.3 更新服务
在ECS服务页面,点击“更新”,选择新版本的任务定义。ECS会执行滚动更新:
先启动一个新容器
等待健康检查通过
停止一个旧容器
重复直到全部更新完成
整个过程用户无感知。
七、第六步:处理常见问题
7.1 容器启动失败
查看CloudWatch Logs,看错误日志。常见原因:
环境变量配置错误,连不上数据库
端口写错
内存不够(任务定义里的内存太小)
健康检查配置错误
7.2 负载均衡器健康检查失败
检查:
健康检查路径是否正确(应用有没有/health端点)
安全组是否允许负载均衡器访问ECS任务
应用是否正常启动
7.3 任务被频繁重启
查看CloudWatch Logs,看应用有没有崩溃。可能是内存不足、代码bug、依赖服务不可用。
八、成本估算
以两个Fargate任务为例,每月成本约:
Fargate计算:0.5vCPU × 2 × 730小时 × 单价
内存:1GB × 2 × 730小时 × 单价
负载均衡器:约20美元/月
CloudWatch日志:存储费用很低
具体用AWS价格计算器算一下。比EC2模式贵一点,但省去了管理服务器的麻烦。
九、结语
从开发到生产,ECS的部署流程其实不复杂。关键是做好基础设施、日志、监控、告警这些基础工作。第一次配置可能花些时间,但以后每次上线就快了。生产环境稳定运行,你才能睡个好觉。
如果需要更深入咨询了解可以联系全球代理上TG:jinniuge 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。
本文由不代表本站立场,转载联系作者并注明出处。
