如何批量删除AWS上的多个CloudFormation栈?
批量删除所有CloudFormation栈操作方案
执行删除操作前请务必确认待删除栈列表无需要保留的资源,CloudFormation删除操作会同步清除栈内所有创建的资源,该操作不可逆,生产环境请谨慎执行
操作步骤
1. 先过滤待删除栈列表做核对
原生aws cloudformation list-stacks默认会返回所有历史栈,包括已经处于DELETE_COMPLETE状态的已删除栈,直接调用删除会报错,所以首先要加状态过滤,只返回当前可删除的活跃栈。
先执行预览命令,确认待删除的栈列表符合预期:
无额外依赖版本(用AWS CLI自带query,不需要装jq)
aws cloudformation list-stacks \ --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE CREATE_FAILED ROLLBACK_COMPLETE ROLLBACK_FAILED UPDATE_ROLLBACK_FAILED DELETE_FAILED \ --query 'StackSummaries[].StackName' \ --output text
用jq过滤版本(适合习惯用jq处理JSON输出的场景)
aws cloudformation list-stacks \ --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE CREATE_FAILED ROLLBACK_COMPLETE ROLLBACK_FAILED UPDATE_ROLLBACK_FAILED DELETE_FAILED \ | jq -r '.StackSummaries[].StackName'
核对上述命令输出的栈名列表,确认没有需要保留的栈之后再执行后续删除操作。如果存在嵌套栈,只需要保留最上层父栈即可,删除父栈时CloudFormation会自动递归删除所有关联子栈,无需单独处理子栈。
2. 执行批量删除
根据你使用的终端环境选择对应命令:
Bash/Zsh(Linux/macOS/Git Bash/WSL)
不需要等待删除完成的快速执行版本:
for stack in $(aws cloudformation list-stacks \ --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE CREATE_FAILED ROLLBACK_COMPLETE ROLLBACK_FAILED UPDATE_ROLLBACK_FAILED DELETE_FAILED \ --query 'StackSummaries[].StackName' \ --output text); do echo "Submitting delete request for stack: $stack" aws cloudformation delete-stack --stack-name $stack done
如果需要等待每个栈删除完成后再处理下一个,方便跟踪进度,可以加wait参数:
for stack in $(aws cloudformation list-stacks \ --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE CREATE_FAILED ROLLBACK_COMPLETE ROLLBACK_FAILED UPDATE_ROLLBACK_FAILED DELETE_FAILED \ --query 'StackSummaries[].StackName' \ --output text); do echo "Submitting delete request for stack: $stack" aws cloudformation delete-stack --stack-name $stack echo "Waiting for stack $stack to be deleted..." aws cloudformation wait stack-delete-complete --stack-name $stack echo "Stack $stack deleted successfully" done
Windows PowerShell
aws cloudformation list-stacks ` --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE CREATE_FAILED ROLLBACK_COMPLETE ROLLBACK_FAILED UPDATE_ROLLBACK_FAILED DELETE_FAILED ` --query 'StackSummaries[].StackName' ` --output text | ForEach-Object { Write-Host "Submitting delete request for stack: $_" aws cloudformation delete-stack --stack-name $_ }
常见问题处理
- 如果开启了栈终止保护,删除时会报错,只需要在
delete-stack命令前加一行关闭保护的命令即可:aws cloudformation update-termination-protection --stack-name $stack --no-enable-termination-protection - 如果有栈删除失败,可以先排查失败原因(常见是资源有依赖、资源被手动修改过无法删除),处理完残留资源后重新执行上述批量命令即可,已经处于
DELETE_COMPLETE的栈会被自动过滤不会重复处理。 - 提交删除请求后可以到CloudFormation控制台查看每个栈的删除进度,不需要保持终端一直打开。
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

