CloudFormation脚本调用ParentId触发KeyError问题求助
问题:CloudFormation脚本访问ParentId触发KeyError
我尝试编写Python脚本打印包含ParentId的CloudFormation栈列表,移除{stack['ParentId']}时脚本可正常运行,但加入该字段后触发KeyError。
原脚本代码
import boto3 session = boto3.Session(profile_name='DevProfile') ec2 = session.client('ec2') regions = [region['RegionName'] for region in ec2.describe_regions()['Regions']] print("logged in") for region in regions: cloudformation = session.client('cloudformation', region_name=region) stacks = cloudformation.describe_stacks() for stack in stacks['Stacks']: tag_list = stack['Tags'] for kvpair in tag_list: if kvpair['Key'] == "Environment": print(f"|| {stack['StackName']} | {stack['ParentId']} ||")
报错信息
$ python stack_info.py logged in Traceback (most recent call last): File "C:\Users\U6065745\stack_info\stack_info.py", line 25, in <module> print(f"|| {stack['StackName']} | {stack['ParentId']} ||") ~~~~~^^^^^^^^^^^^ KeyError: 'ParentId'
根据boto3官方文档,ParentId应与StackName同为describe_stacks接口的返回字段。
解决方案
KeyError的原因
ParentId并非所有栈都会返回的字段,只有**嵌套栈(作为子栈存在的CloudFormation栈)**才会包含该字段,根栈(独立创建的栈)不会返回ParentId。直接用下标stack['ParentId']访问不存在的键会触发KeyError。修复核心问题
使用字典的get()方法安全获取字段,当键不存在时返回指定默认值(比如"无父栈"或None):
print(f"|| {stack['StackName']} | {stack.get('ParentId', '无父栈')} ||")
- 优化标签判断逻辑
原脚本嵌套遍历Tags的效率较低,可以用any()函数简化判断:
# 替换原有的Tags遍历代码块 has_environment_tag = any(tag['Key'] == "Environment" for tag in stack.get('Tags', [])) if has_environment_tag: print(f"|| {stack['StackName']} | {stack.get('ParentId', '无父栈')} ||")
- 处理分页场景(可选)
如果账号内栈数量较多,describe_stacks()会返回分页结果,直接调用可能遗漏部分栈,建议使用分页器:
# 替换stacks = cloudformation.describe_stacks()这一行 paginator = cloudformation.get_paginator('describe_stacks') for page in paginator.paginate(): for stack in page['Stacks']: # 后续标签判断和打印逻辑不变
内容的提问来源于stack exchange,提问作者jaymz
相关产品推荐
相关产品推荐

