如何在Jenkins中维护存在依赖的多个CloudFormation栈的部署顺序
CloudFormation 保障跨栈部署顺序的可落地方案
方法1:使用原生跨栈导出/导入依赖约束
该方案是CloudFormation原生提供的强依赖校验能力,不需要额外修改Jenkins逻辑,完全由CloudFormation侧强制校验:
- 首先在被依赖栈的模板
Outputs段定义需要对外暴露的资源属性,同时添加Export字段标记导出:
# 被依赖栈(比如VPC栈)模板示例 Outputs: VpcId: Value: !Ref MyVPC Export: Name: !Sub "${AWS::StackName}-VpcId" PublicSubnetIds: Value: !Join [",", [!Ref PublicSubnet1, !Ref PublicSubnet2]] Export: Name: !Sub "${AWS::StackName}-PublicSubnetIds"
- 然后在依赖栈的模板中,使用
!ImportValue简写引用被依赖栈导出的属性:
# 依赖栈(比如应用栈)模板示例 Resources: MyAppLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Subnets: !Split [",", !ImportValue "vpc-stack-PublicSubnetIds"] SecurityGroups: - !Ref AppSecurityGroup
这种方式下CloudFormation会自动校验被导入的导出值是否存在:如果被依赖栈还没部署完成、或者部署失败没有生成对应导出值,依赖栈启动部署时会直接报错终止,从规则层面避免顺序错乱。
注意事项:使用导出/导入方式时,被依赖栈的导出值在被其他栈引用期间,无法修改或删除被依赖栈,需要先删除所有引用的依赖栈才能操作。
方法2:嵌套栈统一管理 + DependsOn 显式声明依赖
如果两个栈属于同一套基础设施,可以把两个栈都作为嵌套栈放在同一个父栈模板中,直接用CloudFormation原生的DependsOn字段声明依赖关系:
# 父栈模板示例 Resources: # 被依赖栈 VpcStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./vpc-stack.yaml Parameters: VpcCidr: 10.0.0.0/16 # 依赖栈 AppStack: Type: AWS::CloudFormation::Stack DependsOn: VpcStack # 显式声明依赖VpcStack Properties: TemplateURL: ./app-stack.yaml Parameters: VpcId: !GetAtt VpcStack.Outputs.VpcId
这种方式下CloudFormation会自动等待
VpcStack部署完全成功(状态变为CREATE_COMPLETE/UPDATE_COMPLETE)后,才会启动AppStack的部署,完全不需要调整Jenkins侧逻辑。
方法3:结合Jenkins流水线 + AWS CLI 等待命令
如果不想修改现有CloudFormation模板,可以直接调整Jenkins流水线的阶段逻辑,用AWS CLI提供的等待命令控制执行顺序:
- 在Jenkinsfile中拆分两个独立的部署阶段,先执行被依赖栈的部署,然后调用
aws cloudformation wait命令等待被依赖栈部署完成,再执行依赖栈的部署:
pipeline { agent any stages { stage('部署被依赖VPC栈') { steps { sh 'aws cloudformation deploy --stack-name vpc-stack --template-file vpc.yaml' // 等待栈部署完成,失败会自动抛出错误终止流水线 sh 'aws cloudformation wait stack-create-complete --stack-name vpc-stack' // 如果是更新场景,替换为下面的命令 // sh 'aws cloudformation wait stack-update-complete --stack-name vpc-stack' } } stage('部署依赖应用栈') { steps { sh 'aws cloudformation deploy --stack-name app-stack --template-file app.yaml' } } } }
这种方式不需要调整现有CloudFormation模板,直接在Jenkins侧管控顺序,适合栈归属不同业务线、不方便统一修改模板的场景。该命令最长等待时间为120分钟,若被依赖栈部署失败,命令会自动返回非零退出码终止流水线,避免后续依赖栈错误部署。
内容的提问来源于stack exchange,提问作者Akash tiwari
相关产品推荐
相关产品推荐

