欢迎光临
我们一直在努力

CloudFormation Stack 概念全解析:从资源集合到自动化编排的核心引擎

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: ami0c55b159cbfafe1f0
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会:

  • 创建名为 web-app-dev 的Stack。
  • 根据模板创建EC2实例和安全组。
  • 将这两个资源标记为属于 web-app-dev Stack。
  • 返回Stack ID:arn:aws:cloudformation:us-east-1:123456789:stack/web-app-dev/…

  • 二、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自动识别顺序:

  • 先创建 VPC
  • 等VPC创建完成后,创建 Subnet
  • 等Subnet创建完成后,创建 EC2Instance
  • 删除时自动逆序: 删除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的核心知识:

  • Stack本质:AWS资源的逻辑容器,CloudFormation的基本部署单元。
  • 三大构成要素:模板(Template)+ 参数(Parameters)→ 资源(Resources)。
  • 六大核心用途
    • 统一生命周期管理(一键创建/更新/删除)
    • 自动依赖解析(严格按顺序操作)
    • Change Set变更预览(零风险变更)
    • 环境快速复制(模板复用)
    • 成本追踪(自动标签)
    • 跨区域部署(StackSet)
  • 黄金原则:永远通过Stack管理AWS资源,永远不要手动修改Stack创建的资源。手动修改会导致资源漂移(Drift),破坏基础设施即代码的一致性。
  • 一句话总结: 如果把AWS资源比作积木,Stack就是你搭建的整套作品——你可以一键复制整座城堡,也可以一键拆除重建,而CloudFormation模板就是这张永远不会丢的设计图纸。

    在这里插入图片描述

    🌺The End🌺点点关注,收藏不迷路🌺

    ⬆ ⬆ 顶部 ⬆ ⬆

    赞(0)
    未经允许不得转载:171主机测评 » CloudFormation Stack 概念全解析:从资源集合到自动化编排的核心引擎
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址