尝试打印带有其 ParentId 的 cloudformation 堆栈列表

问题描述 投票:0回答:1

如果我删除

{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 一样。

python amazon-web-services aws-cloudformation boto3
1个回答
0
投票

ParentId
是输出的一部分,但仅限于
Nested stacks
。如果您使用嵌套堆栈,您会看到这一点。可能有一些堆栈是常规堆栈而不是嵌套堆栈,因此它没有此键。

对于 Python 中的字典,最好使用

get(key)
而不是括号
[key]
来访问项目。当使用括号且键不存在时,会出现异常。使用
get
,您可以设置键不存在时返回的默认值。所以,就你的情况而言,我会更改最后一行:

print(f"|| {stack.get('StackName', '')} | {stack.get('ParentId', '')} ||")

这将确保您的代码在

ParentId
不存在时不会中断,并且您稍后可以确认它是未嵌套的堆栈。

© www.soinside.com 2019 - 2024. All rights reserved.