如何用CodeBuild蓝绿部署带Auto Scaling与ALB的ECS服务?解决工件缺失错误
解决CodePipeline ECS部署缺失工件错误并实现蓝绿部署
一、修复「缺失工件」错误
你当前配置的ECS部署动作(version 1)要求input_artifacts必须包含指定FileName的文件,空数组会直接触发缺失工件错误。要解决这个问题并满足蓝绿部署需求,需调整部署动作类型并确保工件包含必要文件:
- 蓝绿部署依赖AWS CodeDeploy,因此要改用
CodeDeployToECS动作类型,该动作需要工件中包含任务定义文件和AppSpec配置文件 - 在流水线的前置阶段(比如Source或Build),将
taskDefinition.json和后续创建的appspec.yaml作为工件输出,再在Deploy动作中引用该工件
二、调整Terraform配置实现蓝绿部署
替换原有的Deploy stage配置,改用CodeDeployToECS动作:
stage { name = "Deploy" action { name = "DeployToECS" category = "Deploy" owner = "AWS" input_artifacts = ["SourceArtifact"] # 替换为你实际的前置工件名称 provider = "CodeDeployToECS" version = "1" configuration = { ApplicationName = var.codedeploy_application_name # 提前创建的CodeDeploy应用名 DeploymentGroupName = var.codedeploy_deployment_group_name # 提前创建的CodeDeploy部署组名 TaskDefinitionTemplate = "taskDefinition.json" AppSpecTemplate = "appspec.yaml" ContainerName = "test-repo" # 与taskDefinition.json中的容器名一致 ContainerPort = 80 # 容器暴露的端口 } } }
三、创建AppSpec.yaml配置文件
AppSpec是蓝绿部署的核心配置,用于定义流量切换规则、实例销毁策略等,和任务定义不重复。示例配置如下:
version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "<TASK_DEFINITION>" # 占位符由CodeDeploy自动替换为新任务定义ARN LoadBalancerInfo: ContainerName: "test-repo" ContainerPort: 80 PlatformVersion: "LATEST" NetworkConfiguration: AwsvpcConfiguration: Subnets: ["subnet-xxxxxx", "subnet-yyyyyy"] # 替换为你的VPC子网ID SecurityGroups: ["sg-xxxxxx"] # 替换为你的服务安全组ID AssignPublicIp: "ENABLED" # 根据网络配置调整(ENABLED/DISABLED) DeploymentConfiguration: DeploymentStyle: DeploymentType: BLUE_GREEN DeploymentOption: WITH_TRAFFIC_CONTROL BlueGreenDeploymentConfiguration: TerminateBlueInstancesOnDeploymentSuccess: Action: TERMINATE TerminationWaitTimeInMinutes: 5 DeploymentReadyWaitTimeInMinutes: 0 GreenFleetProvisioningOption: Action: COPY_AUTO_SCALING_GROUP # 自动复制现有Auto Scaling组配置创建绿组
四、关键注意事项
- 提前准备CodeDeploy资源:需先创建CodeDeploy应用(类型选ECS)和部署组,部署组要关联你的ECS集群、目标服务、ALB以及Auto Scaling组(如果使用自动扩缩容)
- 更新镜像标签触发部署:如果
taskDefinition.json中的镜像地址固定(无动态标签),流水线触发后不会生成新任务定义,蓝绿部署也不会执行。建议在CodeBuild阶段自动更新镜像标签(比如用Git commit hash或版本号),并输出更新后的任务定义作为工件 - 权限配置:确保CodePipeline角色有访问CodeDeploy的权限,CodeDeploy角色有操作ECS服务、ALB、Auto Scaling组的权限
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

