CloudFormation Stack 概念全解析:从资源集合到自动化编排的核心引擎
-
-
- 📈 Stack 生命周期与工作流程图
- 一、核心概念:Stack到底是什么?
-
- 1. 官方定义与通俗理解
- 2. Stack的构成三要素
- 二、Stack的6大主要用途
-
- 用途1:统一生命周期管理 —— 一键创建/更新/删除整组资源
- 用途2:依赖管理 —— 自动解析资源创建顺序
- 用途3:变更预览与风险控制 —— Change Set
- 用途4:环境复制与快速搭建
- 用途5:成本追踪与资源标记
- 用途6:跨区域/跨账号部署 —— StackSet
- 三、Stack 相关概念辨析
- 四、实战:从创建到删除的完整操作流程
- 📊 Stack 状态机完整说明
- 📚 常见问题排查
- 💎 总结
-
|
🌺The Begin🌺点点关注,收藏不迷路🌺 ⬇ ⬇ 底部 ⬇ ⬇ |
如果你刚接触AWS CloudFormation,一定会频繁遇到 Stack 这个词。它到底是"一堆资源"的统称?还是一个技术术语?为什么官方文档反复强调"Everything is a Stack"?
📈 Stack 生命周期与工作流程图
先通过一张图理解Stack在CloudFormation中的核心地位和完整生命周期:
#mermaid-svg-fivVRV2fbjHzVzVX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fivVRV2fbjHzVzVX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fivVRV2fbjHzVzVX .error-icon{fill:#552222;}#mermaid-svg-fivVRV2fbjHzVzVX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fivVRV2fbjHzVzVX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fivVRV2fbjHzVzVX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fivVRV2fbjHzVzVX .marker.cross{stroke:#333333;}#mermaid-svg-fivVRV2fbjHzVzVX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fivVRV2fbjHzVzVX p{margin:0;}#mermaid-svg-fivVRV2fbjHzVzVX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fivVRV2fbjHzVzVX .cluster-label text{fill:#333;}#mermaid-svg-fivVRV2fbjHzVzVX .cluster-label span{color:#333;}#mermaid-svg-fivVRV2fbjHzVzVX .cluster-label span p{background-color:transparent;}#mermaid-svg-fivVRV2fbjHzVzVX .label text,#mermaid-svg-fivVRV2fbjHzVzVX span{fill:#333;color:#333;}#mermaid-svg-fivVRV2fbjHzVzVX .node rect,#mermaid-svg-fivVRV2fbjHzVzVX .node circle,#mermaid-svg-fivVRV2fbjHzVzVX .node ellipse,#mermaid-svg-fivVRV2fbjHzVzVX .node polygon,#mermaid-svg-fivVRV2fbjHzVzVX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fivVRV2fbjHzVzVX .rough-node .label text,#mermaid-svg-fivVRV2fbjHzVzVX .node .label text,#mermaid-svg-fivVRV2fbjHzVzVX .image-shape .label,#mermaid-svg-fivVRV2fbjHzVzVX .icon-shape .label{text-anchor:middle;}#mermaid-svg-fivVRV2fbjHzVzVX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fivVRV2fbjHzVzVX .rough-node .label,#mermaid-svg-fivVRV2fbjHzVzVX .node .label,#mermaid-svg-fivVRV2fbjHzVzVX .image-shape .label,#mermaid-svg-fivVRV2fbjHzVzVX .icon-shape .label{text-align:center;}#mermaid-svg-fivVRV2fbjHzVzVX .node.clickable{cursor:pointer;}#mermaid-svg-fivVRV2fbjHzVzVX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fivVRV2fbjHzVzVX .arrowheadPath{fill:#333333;}#mermaid-svg-fivVRV2fbjHzVzVX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fivVRV2fbjHzVzVX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fivVRV2fbjHzVzVX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fivVRV2fbjHzVzVX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fivVRV2fbjHzVzVX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fivVRV2fbjHzVzVX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fivVRV2fbjHzVzVX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fivVRV2fbjHzVzVX .cluster text{fill:#333;}#mermaid-svg-fivVRV2fbjHzVzVX .cluster span{color:#333;}#mermaid-svg-fivVRV2fbjHzVzVX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fivVRV2fbjHzVzVX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fivVRV2fbjHzVzVX rect.text{fill:none;stroke-width:0;}#mermaid-svg-fivVRV2fbjHzVzVX .icon-shape,#mermaid-svg-fivVRV2fbjHzVzVX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fivVRV2fbjHzVzVX .icon-shape p,#mermaid-svg-fivVRV2fbjHzVzVX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fivVRV2fbjHzVzVX .icon-shape .label rect,#mermaid-svg-fivVRV2fbjHzVzVX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fivVRV2fbjHzVzVX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fivVRV2fbjHzVzVX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fivVRV2fbjHzVzVX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
成功
失败
成功
失败
📄 CloudFormation 模板JSON/YAML
📤 提交到 CloudFormation
⚙️ 创建 Stack
Stack 状态流转
CREATE_IN_PROGRESS创建中
资源创建结果
CREATE_COMPLETE✅ 创建完成
ROLLBACK_IN_PROGRESS⏪ 自动回滚
ROLLBACK_COMPLETE🛑 回滚完成,Stack删除
UPDATE_IN_PROGRESS更新中
更新结果
UPDATE_COMPLETE✅ 更新完成
UPDATE_ROLLBACK_IN_PROGRESS
UPDATE_ROLLBACK_COMPLETE
可按需继续更新
DELETE_IN_PROGRESS删除中
DELETE_COMPLETE🗑️ Stack及资源全部删除
核心本质: Stack是CloudFormation的基本部署单元——它把模板中定义的多个AWS资源作为一个整体来创建、更新和删除。
一、核心概念:Stack到底是什么?
1. 官方定义与通俗理解
| 官方定义 | Stack是AWS CloudFormation中单个单元管理的AWS资源集合 |
| 通俗类比 | 就像一个"资源打包盒"——你把EC2、RDS、VPC等资源打包在一起,给这个盒子命名,之后统一管理这个盒子 |
| 技术本质 | 一个Stack = 一个CloudFormation模板 + 一组参数 + 由此创建的所有AWS资源 |
2. Stack的构成三要素
# 一个完整的Stack由以下三部分构成:
1. 模板(Template)
↓ 描述"要创建什么资源"
2. 参数(Parameters)
↓ 提供"用什么配置创建"
3. 资源(Resources)
↓ 最终"在AWS上实际存在的东西"
直观示例:
# 模板:web-app-stack.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Web Application Stack
# === 参数(创建Stack时传入) ===
Parameters:
Environment:
Type: String
Default: dev
AllowedValues: [dev, staging, prod]
InstanceType:
Type: String
Default: t3.micro
# === 资源(Stack管理的AWS资源) ===
Resources:
WebServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: ami–0c55b159cbfafe1f0
Tags:
– Key: Name
Value: !Sub WebServer–${Environment}
– Key: StackName
Value: !Ref AWS::StackName # 自动记录所属Stack
WebSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Web server security group
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
创建Stack的CLI命令:
aws cloudformation create-stack \\
–stack-name web-app-dev \\
–template-body file://web-app-stack.yaml \\
–parameters ParameterKey=Environment,ParameterValue=dev \\
ParameterKey=InstanceType,ParameterValue=t3.micro
执行后,AWS会:
二、Stack的6大主要用途
用途1:统一生命周期管理 —— 一键创建/更新/删除整组资源
痛点场景: 一个应用需要VPC、子网、EC2、RDS、ELB等5+资源,手动逐个创建耗时且容易遗漏依赖。
Stack解决方案: 把这5个资源定义在一个模板中,作为一个Stack管理。
# 一键创建整个应用环境(包含10+资源)
aws cloudformation create-stack \\
–stack-name my-app-production \\
–template-body file://full-stack.yaml
# 一键更新整个环境
aws cloudformation update-stack \\
–stack-name my-app-production \\
–template-body file://full-stack-v2.yaml
# 一键删除整个环境(测试环境用后即焚)
aws cloudformation delete-stack \\
–stack-name my-app-test
核心价值: 保证所有关联资源的原子性——要么全部创建成功,要么失败自动回滚,不会有"创建了一半"的尴尬状态。
用途2:依赖管理 —— 自动解析资源创建顺序
痛点场景: EC2实例依赖安全组,安全组依赖VPC。手动创建时必须严格按顺序操作。
Stack解决方案: CloudFormation自动分析模板中的引用关系,构建依赖图,按正确顺序创建。
模板中的隐式依赖:
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Subnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC # ← 隐式依赖:Subnet依赖VPC先创建
EC2Instance:
Type: AWS::EC2::Instance
Properties:
SubnetId: !Ref Subnet # ← 依赖Subnet先创建
CloudFormation自动识别顺序:
删除时自动逆序: 删除Stack时,先删EC2Instance → 再删Subnet → 最后删VPC。
用途3:变更预览与风险控制 —— Change Set
痛点场景: 直接修改生产环境资源,不知道这次变更会影响哪些资源、是否会替换数据库。
Stack解决方案: 使用 Change Set(变更集)预览变更影响。
# 1. 创建变更集(不实际执行)
aws cloudformation create-change-set \\
–stack-name my-app-production \\
–template-body file://updated-stack.yaml \\
–change-set-name preview-changes
# 2. 查看变更详情
aws cloudformation describe-change-set \\
–change-set-name preview-changes
# 输出示例:
# {
# "Changes": [
# {
# "ResourceChange": {
# "Action": "Modify", # 修改(而非替换)
# "ResourceType": "AWS::EC2::Instance",
# "Replacement": "False", # 不会替换(数据安全)
# "Details": […]
# }
# }
# ]
# }
# 3. 确认无误后执行变更
aws cloudformation execute-change-set \\
–change-set-name preview-changes
关键判断: Replacement: True 意味着资源会被删除重建(如RDS实例更换引擎版本),可能导致数据丢失,需特别谨慎。
用途4:环境复制与快速搭建
痛点场景: 生产环境出问题,需快速搭建一个完全相同的调试环境。
Stack解决方案: 同一个模板+不同参数 = 多个完全一致的环境。
# 生产环境
aws cloudformation create-stack \\
–stack-name prod \\
–parameters ParameterKey=InstanceType,ParameterValue=t3.large
# 调试环境(同一模板,不同参数)
aws cloudformation create-stack \\
–stack-name debug-prod-issue \\
–parameters ParameterKey=InstanceType,ParameterValue=t3.micro
核心价值: 实现"基础设施即代码"的核心承诺——环境可精确复制,消除"我这能跑你那儿不行"的问题。
用途5:成本追踪与资源标记
痛点场景: AWS账单上几百个资源,不知哪些属于哪个项目、哪个环境。
Stack解决方案: CloudFormation自动为所有Stack资源打标签。
自动生成的标签:
aws:cloudformation:stack-name = my-app-production
aws:cloudformation:stack-id = arn:aws:cloudformation:…
aws:cloudformation:logical-id = WebServer
在AWS Cost Explorer中按Stack筛选:
# 查看某个Stack的成本
# AWS Console → Cost Explorer → Filter by Tag:
# Key: aws:cloudformation:stack-name
# Value: my-app-production
用途: 精确核算每个项目/环境的云成本,为FinOps提供数据支撑。
用途6:跨区域/跨账号部署 —— StackSet
痛点场景: 需要在美国、欧洲、亚洲三个区域部署相同的应用架构。
Stack解决方案: 使用 StackSet,一个操作管理多个区域/账号的Stack。
StackSet 概念:
StackSet(容器)
├── Stack 1: us-east-1 (美国东部)
├── Stack 2: eu-west-1 (欧洲)
└── Stack 3: ap-southeast-1 (亚洲)
# 创建StackSet
aws cloudformation create-stack-set \\
–stack-set-name global-web-app \\
–template-body file://web-app.yaml
# 在三个区域部署Stack实例
aws cloudformation create-stack-instances \\
–stack-set-name global-web-app \\
–regions us-east-1 eu-west-1 ap-southeast-1 \\
–accounts 123456789012
典型场景: AWS Organizations多账号架构中,集中管理所有成员账号的基础设施。
三、Stack 相关概念辨析
| Template | 声明资源的JSON/YAML文件 | 1个模板 → 可创建N个Stack |
| Stack | 由模板创建的资源集合 | 1个Stack ← 1个模板 + 1组参数 |
| StackSet | 跨区域/账号的Stack容器 | 1个StackSet → N个Stack |
| Nested Stack | Stack中引用的子Stack | 父Stack包含子Stack |
| Change Set | 变更操作的预览快照 | Stack变更前的"预告函" |
关键提醒:
- Stack名称在同一个AWS区域必须唯一。
- 删除Stack会删除其中所有资源(除非设置了 DeletionPolicy: Retain)。
- Stack被删除后,不能再回滚——只能重新创建。
四、实战:从创建到删除的完整操作流程
# 1. 验证模板语法
aws cloudformation validate-template \\
–template-body file://my-stack.yaml
# 2. 创建Stack
aws cloudformation create-stack \\
–stack-name my-app-dev \\
–template-body file://my-stack.yaml \\
–parameters ParameterKey=Env,ParameterValue=dev
# 3. 查看Stack状态
aws cloudformation describe-stacks \\
–stack-name my-app-dev \\
–query 'Stacks[0].StackStatus'
# 4. 查看Stack输出值
aws cloudformation describe-stacks \\
–stack-name my-app-dev \\
–query 'Stacks[0].Outputs'
# 5. 查看Stack中的所有资源
aws cloudformation list-stack-resources \\
–stack-name my-app-dev
# 6. 更新Stack(先创建Change Set预览)
aws cloudformation create-change-set \\
–stack-name my-app-dev \\
–template-body file://my-stack-v2.yaml \\
–change-set-name update-preview
aws cloudformation execute-change-set \\
–change-set-name update-preview
# 7. 删除Stack
aws cloudformation delete-stack \\
–stack-name my-app-dev
📊 Stack 状态机完整说明
| CREATE_IN_PROGRESS | 正在创建资源 | 等待 |
| CREATE_COMPLETE | ✅ 创建成功 | 可更新/删除 |
| CREATE_FAILED | ❌ 创建失败 | 检查错误原因 |
| ROLLBACK_IN_PROGRESS | ⏪ 正在回滚 | 等待 |
| ROLLBACK_COMPLETE | 回滚完成(Stack已删除) | 修复模板后重建 |
| UPDATE_IN_PROGRESS | 正在更新 | 等待 |
| UPDATE_COMPLETE | ✅ 更新成功 | 正常使用 |
| UPDATE_ROLLBACK_IN_PROGRESS | ⏪ 更新失败,回滚中 | 等待 |
| DELETE_IN_PROGRESS | 正在删除 | 等待 |
| DELETE_COMPLETE | 🗑️ 已删除 | 不可恢复 |
📚 常见问题排查
| Stack创建失败,显示ROLLBACK | 模板中某个资源配置错误 | 查看Events标签页,找到具体报错资源 |
| 删除Stack失败 | 资源被其他资源依赖 | 先删除依赖资源,或设置 DependsOn |
| UPDATE_ROLLBACK_FAILED | 回滚过程中资源状态异常 | 联系AWS Support,这是最棘手的状态 |
| 资源被手动修改后Stack不一致 | 资源漂移(Drift) | 使用Drift Detection检测并修复 |
💎 总结
通过本文,你已全面掌握CloudFormation Stack的核心知识:
- 统一生命周期管理(一键创建/更新/删除)
- 自动依赖解析(严格按顺序操作)
- Change Set变更预览(零风险变更)
- 环境快速复制(模板复用)
- 成本追踪(自动标签)
- 跨区域部署(StackSet)
一句话总结: 如果把AWS资源比作积木,Stack就是你搭建的整套作品——你可以一键复制整座城堡,也可以一键拆除重建,而CloudFormation模板就是这张永远不会丢的设计图纸。

|
🌺The End🌺点点关注,收藏不迷路🌺 ⬆ ⬆ 顶部 ⬆ ⬆ |




