如何通过CloudFormation在已有ECS任务定义中新增后端容器
可行方案及操作步骤
完全可以通过CloudFormation实现将后端容器加入现有ECS Fargate任务且不影响前端服务,具体操作如下:
1. 调整CloudFormation任务定义模板
在现有AWS::ECS::TaskDefinition资源的ContainerDefinitions数组中,新增后端容器的配置项,保持任务家族(Family)与原前端任务定义一致:
Resources: MyFargateTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: my-frontend-backend-task # 保持原任务家族名称 NetworkMode: awsvpc RequiresCompatibilities: - FARGATE Cpu: "1024" # 根据前后端总资源需求调整,确保不超过Fargate规格限制 Memory: "2048" ContainerDefinitions: # 原前端容器配置(保持不变) - Name: frontend-container Image: !Ref FrontendImageUri PortMappings: - ContainerPort: 80 LogConfiguration: LogDriver: awslogs Options: awslogs-group: /ecs/frontend awslogs-region: !Ref AWS::Region awslogs-stream-prefix: ecs # 新增后端容器配置 - Name: backend-container Image: !Ref BackendImageUri PortMappings: - ContainerPort: 3000 Environment: - Name: DB_HOST Value: !Ref DBEndpoint LogConfiguration: LogDriver: awslogs Options: awslogs-group: /ecs/backend awslogs-region: !Ref AWS::Region awslogs-stream-prefix: ecs
- 确保前后端容器的
Name唯一,端口映射不冲突 - 根据实际资源需求调整任务的
Cpu和Memory,需满足Fargate的规格组合(如0.5vCPU对应1GB/2GB内存,1vCPU对应2GB/4GB等)
2. 配置ECS服务的无中断部署策略
在CloudFormation的AWS::ECS::Service资源中,设置合理的部署配置,保证更新过程中前端服务持续可用:
MyFargateService: Type: AWS::ECS::Service Properties: Cluster: !Ref ECSCluster TaskDefinition: !Ref MyFargateTaskDefinition LaunchType: FARGATE DeploymentConfiguration: MinimumHealthyPercent: 100 # 保证更新期间至少有原数量的健康任务运行 MaximumPercent: 200 # 允许同时运行最多2倍数量的任务 LoadBalancers: # 原前端负载均衡配置(保持不变) - ContainerName: frontend-container ContainerPort: 80 TargetGroupArn: !Ref FrontendTargetGroup # 新增后端负载均衡配置(若需对外暴露) - ContainerName: backend-container ContainerPort: 3000 TargetGroupArn: !Ref BackendTargetGroup
MinimumHealthyPercent: 100确保旧任务(仅前端)在新任务(前后端)健康前不会被终止- 若后端服务无需对外暴露,可省略对应的负载均衡配置
3. 整合后端CI/CD流水线
修改后端的CodePipeline和CodeBuild,使其触发CloudFormation更新:
- 在CodeBuild中,构建后端镜像并推送到ECR后,输出镜像URI(如
ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/backend:TAG)作为流水线的输出变量 - 在CodePipeline的CloudFormation部署阶段,将
BackendImageUri参数设为CodeBuild输出的镜像URI,触发任务定义的版本更新 - 前端流水线保持原有逻辑,仅更新
FrontendImageUri参数,各自独立触发任务定义的增量更新
4. 验证与测试
- 在测试环境执行流水线,检查CloudFormation变更集,确认仅更新任务定义版本和服务部署,无其他资源变更
- 验证ECS控制台中,新任务同时运行前后端容器,旧任务在新任务健康后自动终止
- 测试前端服务是否无中断,后端服务是否正常运行、与前端通信正常
内容的提问来源于stack exchange,提问作者Rehan Shakeel
相关产品推荐
相关产品推荐

