如何让CodePipeline在CodeDeploy蓝绿部署就绪后跳过终止原实例步骤?
解决CodePipeline等待CodeDeploy蓝绿部署全流程完成的问题
我之前也碰到过一模一样的需求——想让流水线在绿色环境就绪、流量切换完成后就继续往下走,而不是卡在那里等旧实例被终止。这里有个比把等待时间设为0更优雅的方案:
核心思路
把蓝绿部署里的「终止原实例」步骤从CodeDeploy的自动流程中剥离出来,让CodeDeploy在完成绿色环境部署、流量切换(如果配置了)后就标记部署成功,这样CodePipeline会直接进入下一阶段;而终止旧实例的操作,我们用外部定时任务来延迟执行。
具体步骤
1. 修改CodeDeploy部署配置,关闭自动终止旧实例
进入CodeDeploy控制台,找到你当前用的蓝绿部署配置(或者新建一个专属配置):
- 在蓝绿部署选项里,找到「终止原始实例」的设置项
- 选择「不自动终止原始实例」(Do not terminate original instances automatically)
- 保存这个部署配置
调整后,当CodeDeploy完成绿色实例部署、验证环节(如果有配置)、流量切换(如果开启)后,就会把部署状态标记为「成功」,不会再执行终止旧实例的步骤。CodePipeline收到这个成功信号后,会立刻推进到下一阶段,不会再等待。
2. 配置延迟终止旧实例的定时任务
接下来实现延迟数小时终止旧实例的逻辑,推荐用CloudWatch Events + Lambda的组合:
- 第一步:创建Lambda函数
写一个简单的Lambda函数,调用CodeDeploy的API触发旧实例终止。你可以通过CloudWatch事件传递部署ID,或者在函数里查询目标应用的最新成功部署。
示例Python代码:import boto3 codedeploy = boto3.client('codedeploy') def lambda_handler(event, context): # 从事件中提取部署ID,也可根据应用/部署组查询 deployment_id = event['detail']['deploymentId'] codedeploy.terminate_deployment( deploymentId=deployment_id, terminateInstances=True ) return {'statusCode': 200, 'body': 'Termination initiated'} - 第二步:创建CloudWatch Events规则
- 事件源选择「CodeDeploy部署状态变更」,过滤出「部署成功」的事件,同时匹配你的应用和部署组
- 目标设置为刚才创建的Lambda函数,然后配置延迟触发(比如3小时)——CloudWatch Events支持直接设置延迟时间,也可以用Step Functions实现更灵活的延迟逻辑
- 这样每当CodeDeploy完成绿色部署并标记成功后,CloudWatch会在指定延迟时间后触发Lambda,自动终止旧实例
额外注意事项
- 如果你的蓝绿部署没配置流量切换,只是部署绿色实例,要确保CodeDeploy在绿色实例就绪后就标记成功,避免流水线提前继续带来风险
- 测试时可以先缩短延迟时间,验证整个流程:CodePipeline正常推进、绿色实例运行稳定、延迟后旧实例被终止
- 记得给Lambda配置足够的IAM权限,允许它调用CodeDeploy的
terminateDeploymentAPI,以及读取CloudWatch事件的权限
内容的提问来源于stack exchange,提问作者Nikolay Grishchenko
相关产品推荐
相关产品推荐

