如何从CloudFormation已删除栈列表中获取指定StackId
问题
需要通过AWS CloudFormation的list_stacks()方法,筛选出名称包含BastionInfraStack、状态为DELETE_COMPLETE的最近删除的栈,并提取其StackId。
list_stacks()返回结果如下:
{"StackSummaries": [{"StackId": "arn:aws:cloudformation:us-east-2:111111111:stack/Dev-BastionInfraStack/34deb540-9c2f-11ed-90a7-022b01b65a64", "StackName": "Dev-BastionInfraStack", "CreationTime": "2023-01-24T21:36:48.468000+00:00", "LastUpdatedTime": "2023-01-24T21:37:26.782000+00:00", "DeletionTime": "2023-01-24T22:19:03.403000+00:00", "StackStatus": "DELETE_COMPLETE", "DriftInformation": {"StackDriftStatus": "NOT_CHECKED"}}, {"StackId": "arn:aws:cloudformation:us-east-2:111111111:stack/TestInfraStack/cf6d58d0-9b8c-11ed-a58b-02446413ef88", "StackName": "Dev-BastionInfraStack", "CreationTime": "2023-01-24T16:53:12.552000+00:00", "LastUpdatedTime": "2023-01-24T20:45:36.941000+00:00", "DeletionTime": "2023-01-24T21:15:49.673000+00:00", "StackStatus": "DELETE_COMPLETE", "DriftInformation": {"StackDriftStatus": "NOT_CHECKED"}}, {"StackId": "arn:aws:cloudformation:us-east-2:111111111:stack/Dev-BastionInfraStack/54bcf7c0-9b51-11ed-bae1-02f106ea059a", "StackName": "Dev-BastionInfraStack", "CreationTime": "2023-01-23T19:08:33.666000+00:00", "LastUpdatedTime": "2023-01-23T19:09:06.759000+00:00", "DeletionTime": "2023-01-23T20:59:59.677000+00:00", "StackStatus": "DELETE_COMPLETE", "DriftInformation": {"StackDriftStatus": "NOT_CHECKED"}}]}
当前已有的获取栈列表代码:
deleted_stacks = cfn.list_stacks(StackStatusFilter=['DELETE_COMPLETE'])
解决方案
可以通过以下步骤实现需求:
- 从返回结果中筛选出
StackName包含BastionInfraStack的栈 - 按
DeletionTime降序排序,确保最近删除的栈排在首位 - 提取排序后第一个栈的
StackId
具体代码示例:
# 获取已删除的栈列表 deleted_stacks = cfn.list_stacks(StackStatusFilter=['DELETE_COMPLETE']) stack_summaries = deleted_stacks.get('StackSummaries', []) # 筛选名称包含BastionInfraStack的栈(简单包含匹配,无需正则) target_stacks = [ stack for stack in stack_summaries if 'BastionInfraStack' in stack['StackName'] ] # 按删除时间降序排序,最近删除的在前 target_stacks_sorted = sorted( target_stacks, key=lambda x: x['DeletionTime'], reverse=True ) # 提取最近删除的栈的StackId if target_stacks_sorted: latest_deleted_stack_id = target_stacks_sorted[0]['StackId'] # 后续可直接使用latest_deleted_stack_id变量 else: latest_deleted_stack_id = None print("未找到符合条件的栈")
说明
- 若需要更复杂的匹配规则(比如前缀/后缀匹配),可以替换为正则表达式,例如:
import re; re.search(r'^.*BastionInfraStack.*$', stack['StackName']) - 排序逻辑依赖
DeletionTime字段的时间格式,AWS返回的时间字符串可直接用于排序比较 - 增加空列表判断,避免无符合条件栈时触发索引错误
内容的提问来源于stack exchange,提问作者msaavedra91
相关产品推荐
相关产品推荐

