Amazon cloudformation 扫描云信息堆栈层次结构的资源
我在尝试递归地扫描层次结构时感到沮丧 自动气象站云层形成堆栈的数量。我需要看看他们所有的照片 资源 回想一下,一个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
描述\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的行为有点违反直觉。希望我的解释尽可能清楚,至少。