如何按指定顺序高效删除AWS CloudFormation堆栈?
高效按序删除CloudFormation堆栈的实现方案
核心思路
直接用jq一次性完成堆栈名称的筛选和分组,避免多次调用AWS CLI或额外的文本处理工具,减少不必要的开销,同时严格按照需求的顺序执行删除。
优化后的脚本
# 一次性获取所有堆栈名称并按规则分组 read -r -d '' GROUP1 GROUP2 GROUP3 <<< "$(aws cloudformation describe-stacks | jq -r ' # 定义需要最后删除的特殊堆栈列表 def special_stacks: ["aws-infrastructure-users", "bootstrap-credentials-aws"]; .Stacks[].StackName | # 分组:先筛选mmm开头的,再筛选ddd结尾的,最后是特殊堆栈和剩余其他 if startswith("mmm") then . + "\tgroup1" elif endswith("ddd") then . + "\tgroup2" elif IN(special_stacks[]) then . + "\tgroup3" else . + "\tgroup3" end | # 按分组排序,确保group1先处理,然后group2,最后group3 sort_by(.[-6:]) | # 拆分分组输出,用换行分隔每个分组内的堆栈,用空行分隔不同分组 group_by(.[-6:])[] | map(split("\t")[0]) | join("\n") ')" # 定义删除函数,复用逻辑 delete_stacks() { local stack_list="$1" if [ -z "$stack_list" ]; then return; fi for stack_name in $stack_list; do # 直接用堆栈名删除,无需额外查StackId(CLI支持用名称) aws cloudformation delete-stack --stack-name "$stack_name" echo "正在删除CloudFormation堆栈:$stack_name" aws cloudformation wait stack-delete-complete --stack-name "$stack_name" done } # 按顺序执行删除 delete_stacks "$GROUP1" delete_stacks "$GROUP2" delete_stacks "$GROUP3"
优化点说明
- 减少CLI调用:仅调用一次
aws cloudformation describe-stacks,避免循环内重复查询StackId(实际上删除堆栈直接用名称即可,无需StackId) - 纯jq处理分组:利用
jq的字符串匹配和分组功能,一次性完成所有堆栈的分类排序,比grep加管道的组合更高效 - 逻辑复用:封装删除函数,避免重复代码
- 顺序严格可控:通过分组排序确保先处理
mmm*开头的堆栈,再处理*ddd结尾的,最后处理特殊的基础设施用户、凭证类堆栈及剩余所有堆栈
内容的提问来源于stack exchange,提问作者Aswin
相关产品推荐
相关产品推荐

