SAM CLI部署的CloudFormation栈无法用栈名执行delete-stack如何处理
解决方案:通过自定义栈名查询CloudFormation StackId
报错原因
出现要求传入StackId的报错,通常是因为当前AWS区域存在多个同名栈记录(例如状态为DELETE_COMPLETE的历史同名栈还会保留在CloudFormation的操作记录中),CloudFormation无法通过栈名唯一识别目标栈。
直接查询StackId(无需自行解析输出)
你可以直接通过AWS CLI内置的--query参数(基于JMESPath查询语法)实现过滤,不需要手动编写逐行解析脚本。
精确匹配栈名查询StackId
使用describe-stacks查询当前非删除状态的目标栈StackId:
aws cloudformation describe-stacks \ --stack-name my_lambda_stack \ --query "Stacks[?StackName=='my_lambda_stack'].StackId" \ --output text
如果需要查询所有状态(含已删除)的同名栈StackId,可以用list-stacks命令:
aws cloudformation list-stacks \ --query "StackSummaries[?StackName=='my_lambda_stack'].StackId" \ --output text
通配符模糊匹配栈名
如果需要匹配前缀/包含特定字符串的栈,可以用JMESPath内置的starts_with、contains函数实现:
- 查询所有名称以
my_lambda开头的栈的StackId:
aws cloudformation list-stacks \ --query "StackSummaries[?starts_with(StackName, 'my_lambda')].StackId" \ --output text
- 查询所有名称包含
lambda字符串的栈的StackId:
aws cloudformation list-stacks \ --query "StackSummaries[?contains(StackName, 'lambda')].StackId" \ --output text
一步完成查询+删除栈
你可以直接将查询结果作为参数传入delete-stack命令,无需手动复制StackId:
aws cloudformation delete-stack \ --stack-name $(aws cloudformation describe-stacks \ --stack-name my_lambda_stack \ --query "Stacks[?StackName=='my_lambda_stack'].StackId" \ --output text)
内容的提问来源于stack exchange,提问作者Yang X
相关产品推荐
相关产品推荐

