You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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组配置创建绿组

四、关键注意事项

  1. 提前准备CodeDeploy资源:需先创建CodeDeploy应用(类型选ECS)和部署组,部署组要关联你的ECS集群、目标服务、ALB以及Auto Scaling组(如果使用自动扩缩容)
  2. 更新镜像标签触发部署:如果taskDefinition.json中的镜像地址固定(无动态标签),流水线触发后不会生成新任务定义,蓝绿部署也不会执行。建议在CodeBuild阶段自动更新镜像标签(比如用Git commit hash或版本号),并输出更新后的任务定义作为工件
  3. 权限配置:确保CodePipeline角色有访问CodeDeploy的权限,CodeDeploy角色有操作ECS服务、ALB、Auto Scaling组的权限

内容的提问来源于stack exchange,提问作者Francesco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:19:55