You need to enable JavaScript to run this app. 如何在Jenkins中维护存在依赖的多个CloudFormation栈的部署顺序
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:54:02