Amazon cloudformation 扫描云信息堆栈层次结构的资源

Amazon cloudformation 扫描云信息堆栈层次结构的资源,amazon-cloudformation,boto3,Amazon Cloudformation,Boto3,我在尝试递归地扫描层次结构时感到沮丧 自动气象站云层形成堆栈的数量。我需要看看他们所有的照片 资源 回想一下,一个CloudFormation堆栈可以包含另一个堆栈 这些子堆栈的描述似乎由返回 描述\u堆栈\u资源没有用处 我的问题的一个例子如下: 使用Boto3,我们可以看到该堆栈有八个子堆栈: In [22]: resources = cfn.describe_stack_resources(StackName=my_stack_name)['StackResources'] In [23

我在尝试递归地扫描层次结构时感到沮丧 自动气象站云层形成堆栈的数量。我需要看看他们所有的照片 资源

回想一下,一个CloudFormation堆栈可以包含另一个堆栈

这些子堆栈的描述似乎由返回
描述\u堆栈\u资源
没有用处

我的问题的一个例子如下:

使用Boto3,我们可以看到该堆栈有八个子堆栈:

In [22]: resources = cfn.describe_stack_resources(StackName=my_stack_name)['StackResources']

In [23]: len(resources)
Out[23]: 8

In [24]: [r['ResourceType'] for r in resources]
Out[24]: 
['AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack',
 'AWS::CloudFormation::Stack']
奇怪的是,所有这些子堆栈都被报告为具有 创建它们的父级,尽管它们具有不同的
PhysicalResourceId
s

In [25]: [r['StackName'] == my_stack_name for r in resources]
Out[25]: [True, True, True, True, True, True, True, True]

In [29]: resources[0]['PhysicalResourceId'] == resources[1]['PhysicalResourceId']
Out[29]: False
如果我使用子堆栈的物理ID请求子堆栈的资源,则它不起作用,而是获取父级的资源:

In [32]: p_id_0 = resources[0]['PhysicalResourceId']

In [33]: child_resources = cfn.describe_stack_resources(PhysicalResourceId=p_id_0)['StackResources']

In [34]: child_resources == resources
Out[34]: True

是否有解决方法?

此命令将列出所有嵌套堆栈的资源:

map(lambda x: cfn.describe_stack_resources(StackName=x['PhysicalResourceId'])['StackResources'], cfn.describe_stack_resources(StackName=my_stack_name)['StackResources'])
有关此API的请求参数/响应元素的详细信息,请参阅API文档

在请求中,
StackName
参数接受堆栈的名称或其唯一的堆栈ID。在内部堆栈调用中,您可以提供资源的
PhysicalResourceId
s,因为物理ID(内部函数返回的字符串)作为此资源类型的堆栈ID

请注意,在响应中,属性表示与父堆栈关联的名称,而不是所描述资源的堆栈名称

还请注意,使用
PhysicalResourceId
参数调用
descripebackresources
,将返回包含该物理资源ID的父堆栈的所有资源,而不是由该物理资源ID表示的堆栈的资源,如API文档中所述:

返回正在运行和已删除堆栈的AWS资源描述。如果指定了
StackName
,则返回作为堆栈一部分的所有关联资源。如果指定了
PhysicalResourceId
,则返回该资源所属堆栈的关联资源


好的,那就行了;谢谢但有两件事。我觉得非常奇怪的是,您将一个id传递给一个带有名称的参数。首先,编写StackName=x['PhysicalResourceId']。第二,他们记录了一个看起来很奇怪的行为,要求X的子对象返回X的父对象的子对象,这很好。我的困惑是恰当的还是有什么原因不应该让我感到困惑。我破解了另一个修复方法,即从PhysicalResourceID中删除堆栈的名称。stack_physical_resource_id.split(':')[5].split('/')[1]我认为没有必要使用pull例程-对于一个资源,
PhysicalResourceID
(模板中的内在函数)是stack id,而对于
descripebackresources
StackName
,您可以提供堆栈的名称或堆栈ID。是的,这有点混乱,这个API的行为有点违反直觉。希望我的解释尽可能清楚,至少。