You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接口的返回字段。


解决方案

  1. KeyError的原因
    ParentId并非所有栈都会返回的字段,只有**嵌套栈(作为子栈存在的CloudFormation栈)**才会包含该字段,根栈(独立创建的栈)不会返回ParentId。直接用下标stack['ParentId']访问不存在的键会触发KeyError。

  2. 修复核心问题
    使用字典的get()方法安全获取字段,当键不存在时返回指定默认值(比如"无父栈"或None):

print(f"|| {stack['StackName']} | {stack.get('ParentId', '无父栈')} ||")
  1. 优化标签判断逻辑
    原脚本嵌套遍历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', '无父栈')} ||")
  1. 处理分页场景(可选)
    如果账号内栈数量较多,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:45:32