如果我删除
{stack['ParentId']}
,此脚本就可以工作,但是当包含它时,该脚本就会中断。
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'
根据 文档 ParentId 应该是输出的一部分,就像 StackName 一样。
ParentId
是输出的一部分,但仅限于 Nested stacks
。如果您使用嵌套堆栈,您会看到这一点。可能有一些堆栈是常规堆栈而不是嵌套堆栈,因此它没有此键。
对于 Python 中的字典,最好使用
get(key)
而不是括号 [key]
来访问项目。当使用括号且键不存在时,会出现异常。使用 get
,您可以设置键不存在时返回的默认值。所以,就你的情况而言,我会更改最后一行:
print(f"|| {stack.get('StackName', '')} | {stack.get('ParentId', '')} ||")
这将确保您的代码在
ParentId
不存在时不会中断,并且您稍后可以确认它是未嵌套的堆栈。