如何在CodePipeline审批拒绝时触发回滚阶段?实现分支流程
CodePipeline蓝绿部署:回滚实现与审批关联条件阶段方案
一、编程方式从最终阶段执行回滚
完全可以实现,核心是结合AWS API、DynamoDB的蓝绿标志和Lambda函数触发回滚流程:
- 在最终审批阶段后添加Lambda动作,读取DynamoDB中存储的旧版本元数据(比如旧ECS堆栈ARN、API Gateway旧集成配置参数)
- 通过AWS SDK/CLI调用对应服务API完成回滚:
- 用
aws apigateway update-integration将API集成恢复到旧ECS堆栈端点 - 若旧ECS堆栈未被删除,直接调用
aws cloudformation update-stack恢复旧配置;若已标记待删,可取消删除并重新激活
- 用
- 回滚完成后更新DynamoDB的蓝绿标志,保证部署状态一致性
二、关联审批结果的条件阶段配置
可以实现,关键是利用CodePipeline的审批输出变量和阶段过渡条件关联审批动作与后续分支:
- 配置审批阶段输出变量:
创建审批动作时(控制台或Terraform),开启输出变量功能,将审批结果(Approved/Rejected)存入自定义变量,比如命名为ApprovalDecision - 创建两个分支阶段:
- 一个阶段负责「移除旧ECS堆栈与API配置」
- 另一个阶段负责「部署旧配置(回滚)」
- 设置阶段过渡条件:
- 给「移除旧堆栈」阶段设置过渡条件:
#{最终审批阶段名.ApprovalDecision} == Approved - 给「回滚旧配置」阶段设置过渡条件:
#{最终审批阶段名.ApprovalDecision} == Rejected
- 给「移除旧堆栈」阶段设置过渡条件:
- 权限与语法注意:
- 确保CodePipeline服务角色拥有读取审批阶段输出变量的权限
- 条件表达式必须使用
#{阶段名.输出变量名}格式,变量名需和审批动作中定义的完全一致
实操补充
若用Terraform定义CodePipeline,需在aws_codepipeline_stage的action块中配置output_variables,示例:
action { name = "Final-Approval" category = "Approval" owner = "AWS" provider = "Manual" version = "1" output_variables = { ApprovalDecision = "$(ApprovalDecision)" } }
后续阶段的transition块中设置condition:
transition { from_stage = "Final-Approval" condition = "#{Final-Approval.ApprovalDecision} == Approved" }
- 回滚用的Lambda函数需配置最小权限IAM角色,仅授予操作API Gateway、CloudFormation/ECS、DynamoDB的必要权限
内容的提问来源于stack exchange,提问作者Martin T
相关产品推荐
相关产品推荐

