首页
/ AWS CLI CloudFormation delete-stack 命令完全指南:删除资源栈的进阶用法与底层原理

AWS CLI CloudFormation delete-stack 命令完全指南:删除资源栈的进阶用法与底层原理

2026-09-14 17:30:40作者:凤尚柏Louis

导读

本文以 AWS CLI 官方示例文档 delete-stack.rst 为核心,深入讲解 aws cloudformation delete-stack 命令的完整用法。你将掌握资源栈删除的基础命令、RetainResourcesDeletionModeRoleARN 等关键参数的实战配置,并了解命令在 service-2.json 中定义的底层模型与调用约束,能够在自动化脚本中安全、可控地清理 AWS CloudFormation 资源栈。

一、命令概览:从一行示例开始

仓库中的官方示例文档 delete-stack.rst 给出了最基础也最常用的删除资源栈方式:

aws cloudformation delete-stack \
    --stack-name my-stack

该命令的作用是删除指定的 CloudFormation 资源栈。示例文档特别注明:此命令执行成功后不产生任何输出("This command produces no output")。这是删除类 API 的典型行为——请求被接收即返回成功,真正的删除过程在后台异步进行。

注意:delete-stack 只删除资源栈及其管理的资源,它不会删除您手动在 AWS 控制台或通过其他方式创建的资源(例如独立创建的 S3 桶、DynamoDB 表),这类资源只能通过 --retain-resources 参数有选择地保留(详见下文),而未被栈管理的资源在删除前需要您自行确认。

二、参数详解:来自服务模型的完整字段

通过阅读 service-2.jsonDeleteStack 操作的定义,可以看到 DeleteStackInput 结构包含 6 个成员参数,其中只有 StackName 是必填项。以下逐一说明:

参数 类型 必填 说明
--stack-name String 栈的名称或唯一栈 ID(ARN)
--retain-resources List 删除失败(DELETE_FAILED)状态下要保留的资源逻辑 ID 列表
--role-arn String CloudFormation 删除栈时代为调用的 IAM 角色 ARN
--client-request-token String 幂等请求的唯一标识符,用于安全重试
--deletion-mode String 删除模式:STANDARDFORCE_DELETE_STACK
--deployment-config Structure 部署配置(含 ModeDisableRollback

1. --stack-name:唯一必填参数

DeleteStackInput 定义 中,StackName 是唯一被 required 标记的成员。它既可以是栈名(如 my-stack),也可以是完整的栈 ARN(如 arn:aws:cloudformation:us-east-1:123456789012:stack/my-stack/466df9e0-0dff-08e3-8e2f-5088487c4896)。使用 ARN 可以避免不同区域同名栈带来的歧义。

2. --retain-resources:删除失败时的资源保留

当栈处于 DELETE_FAILED 状态时,某些资源可能无法删除(典型场景是非空的 S3 桶)。此时可以指定要保留的资源逻辑 ID 列表,CloudFormation 会删除栈本身,但不会删除这些被标记保留的资源

aws cloudformation delete-stack \
    --stack-name my-stack \
    --retain-resources MyS3Bucket MyDynamoDBTable

在服务模型中,RetainResources 是一个 LogicalResourceId 列表。所谓逻辑 ID,是您在模板中为资源声明的名称(如 MyS3Bucket),而非 AWS 物理资源名。这一机制为"清理栈但保留数据"提供了官方支持。

3. --role-arn:以指定角色执行删除

CloudFormation 在删除栈的过程中需要调用 AWS API(如删除 EC2 实例、S3 对象),这些调用使用 IAM 角色凭据完成。若指定 --role-arn,CloudFormation 将假设该角色执行删除;若不指定:

  • 优先使用栈创建/更新时关联的既有角色;
  • 若栈没有关联角色,则使用基于您的用户凭据生成的临时会话。

角色 ARN 长度约束为 20 到 2048 字符(见 service-2.jsonRoleARN 形状定义)。

4. --client-request-token:幂等重试的保障

ClientRequestToken 是一个 1 到 128 字符的字符串(模式为 [a-zA-Z0-9][-a-zA-Z0-9]*),用于标记请求的唯一性:

  • 当您重试 DeleteStack 请求时,CloudFormation 凭此令牌识别出这是同一请求,不会因重复提交而产生副作用;
  • 同一栈操作产生的所有 StackEvent 都会携带相同的令牌,便于在 describe-stack-events 输出中追踪操作链路;
  • 控制台发起的操作使用 Console-StackOperation-ID 格式的令牌(如 Console-DeleteStack-7f59c3cf-00d2-40c7-b2ff-e75db0987002),方便在 Events 标签页快速识别。

5. --deletion-mode:标准删除与强制删除

服务模型 DeletionMode 枚举 定义了两种模式:

取值 行为
STANDARD 标准行为,与不指定该参数完全等价
FORCE_DELETE_STACK 当栈因资源删除失败而卡在 DELETE_FAILED 状态时,强制删除栈
# 强制删除卡在 DELETE_FAILED 状态的栈
aws cloudformation delete-stack \
    --stack-name my-stack \
    --deletion-mode FORCE_DELETE_STACK

该模式适用于自动化清理"僵尸栈"的场景,避免运维流程被失败状态阻塞。

6. --deployment-config:删除操作的部署配置

DeploymentConfig 是较新引入的结构化参数,包含两个子字段:

  • ModeSTANDARD(默认,等待资源就绪后完成操作)或 EXPRESS(应用资源配置后即完成操作,资源在后台继续就绪);
  • DisableRollback:布尔值,指定删除操作失败时是否禁用回滚,默认 false

对应枚举定义见 DeploymentConfigMode(取值为 STANDARDEXPRESS)。

三、错误处理与可观测性

服务端异常

在服务模型中,DeleteStack 操作声明的唯一错误形状是 TokenAlreadyExistsException。该异常在您重用已存在的 ClientRequestToken 时抛出,因此:

  • 每次新的删除操作应生成新的唯一令牌;
  • 重试同一操作时才应复用原令牌。

从源码结构看,TokenAlreadyExistsException 会映射为 AWS CLI 的 TokenAlreadyExistsException 异常类,用户可通过 $? 退出码与错误输出捕获失败。

删除过程的观察:无输出 ≠ 无操作

由于 delete-stack 无输出,如何确认删除真正发生?官方配套示例给出了两条路径:

  1. 查询栈状态describe-stacks 可列出栈及其状态(DELETE_IN_PROGRESSDELETE_COMPLETE / DELETE_FAILED)。文档明确指出:删除成功后,已删除的栈不再出现在 DescribeStacks 结果中。
  2. 查询事件流describe-stack-events 展示每个资源的删除事件,可定位哪一步失败及失败原因。
# 观察删除进度(轮询直到栈从列表中消失或进入 DELETE_FAILED)
aws cloudformation describe-stacks --stack-name my-stack

# 查看资源级删除事件,定位失败资源
aws cloudformation describe-stack-events --stack-name my-stack

四、实战:删除一个资源栈的完整流程

场景 A:常规删除(无输出)

aws cloudformation delete-stack --stack-name my-stack
echo "Exit code: $?"    # 0 表示请求已受理

场景 B:幂等化删除(适用于 CI/CD 脚本重试)

aws cloudformation delete-stack \
    --stack-name my-stack \
    --client-request-token "delete-my-stack-$(date +%s)"

场景 C:删除但保留关键数据资源

aws cloudformation delete-stack \
    --stack-name my-stack \
    --retain-resources DataBucket LogTable

场景 D:强制清理失败栈

aws cloudformation delete-stack \
    --stack-name stuck-stack \
    --deletion-mode FORCE_DELETE_STACK

关联命令的边界

注意区分删除栈与其他删除操作,官方示例库 cloudformation 示例目录 提供了对照:

# 若栈开启了终止保护,需先关闭保护再执行删除
aws cloudformation update-termination-protection \
    --stack-name my-stack \
    --no-enable-termination-protection

aws cloudformation delete-stack --stack-name my-stack

五、底层原理:HTTP 与协议细节

service-2.jsonDeleteStack 操作定义可以看出实现细节:

  • 传输方式:HTTP 方法为 POST,请求 URI 为 /(CloudFormation 服务采用 POST + X-Amz-Target 头部的 JSON 协议,目标为 CloudFormation.DeleteStack);
  • 输入校验:参数经 DeleteStackInput 形状定义做类型与约束校验,例如 RoleARN 长度 20–2048、ClientRequestToken 长度 1–128;
  • 异步语义:调用成功仅代表删除流程启动,实际删除在后台执行,这是"无输出"以及需要配合 describe-stacks 轮询的根本原因。

六、小结与最佳实践

  • delete-stack异步、无输出的操作,删除进度必须通过 describe-stacksdescribe-stack-events 观察;
  • 唯一必填参数是 --stack-name(名称或 ARN),其余参数均为高级选项;
  • 数据类资源(如 S3 桶)需要保留时,使用 --retain-resources 指定逻辑 ID;
  • 自动化脚本中应使用 --client-request-token 保证重试幂等;
  • 栈卡在 DELETE_FAILED 时,使用 --deletion-mode FORCE_DELETE_STACK 强制清理;
  • 已开启终止保护的栈无法直接删除,需先通过 update-termination-protection 关闭保护;
  • 相关模型与约束细节可在 service-2.json 中查阅,示例参照 delete-stack.rst 及同目录下 describe-stacks.rstdescribe-stack-events.rst 等官方示例。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
34
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.21 K
2.81 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
945
1.86 K
docsdocs
暂无描述
Markdown
906
5.84 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
537
607
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
864
1.36 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
4.28 K
1.03 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.39 K
1.48 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
550
401
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.19 K
347