2017-01-11 19 views
0

AWS CloudFormationスタックの階層 を再帰的に掃除しようとしています。 のすべてのリソースを参照する必要があります。階層構造のリソースをスキャンする

1つのCloudFormationスタックに、もう1つのスタックを含めることができます。

describe_stack_resourcesによって返されたこれらのサブスタックの説明は役に立ちません。

私の問題の例を以下に示します。

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'] 
不思議

、これらすべてのsubstacksが の名前を持つと報告されています。私たちは、このスタックは持って見ることができるBoto3を使用

は8 substacksを持っています親はPhysicalResourceIdを区別していますが、それらを作成した親です。私が代わりに親のリソース取得

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を使用してsubstackのリソースを要求した場合、それは動作しません、:

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 

は、回避策はありますか?

答えて

0

このコマンドは、すべてのネストされたスタックのリソースをリストします:

map(lambda x: cfn.describe_stack_resources(StackName=x['PhysicalResourceId'])['StackResources'], cfn.describe_stack_resources(StackName=my_stack_name)['StackResources']) 

は、このAPIのリクエストパラメータ/応答要素の詳細についてはDescribeStackResources APIのドキュメントを参照してください。リクエストで

StackNameパラメータはいずれかスタックの名前または独自のスタックIDを受け入れます。インナースタックコールでは、物理ID(Ref組み込み関数によって返される文字列)がこのリソースタイプのスタックIDとしてdefinedであるため、AWS::CloudFormation::StackリソースのPhysicalResourceIdを指定できます。

応答では、StackResources.StackNameプロパティは、親のスタックに関連付けられた名前を表し、記述されているリソースのスタック名ではありません。

はまたPhysicalResourceIdパラメータでDescribeStackResourcesを呼び出すと、APIで説明したように、その物理リソースのIDを含む親スタックのすべてのリソースは、スタックのリソースは、その物理リソースIDによって表されていない返すことに注意してくださいドキュメント:

実行中のスタックと削除されたスタックのAWSリソースの説明を返します。 StackNameが指定されると、スタックの一部である関連するすべてのリソースが返されます。 PhysicalResourceIdを指定すると、リソースが属するスタックの関連リソースが返されます。

+0

ありがとう!しかし、2つのこと。私はあなたが名前を取るパラメータにIDを渡すことは非常に興味があることがわかります。まず、StackName = x ['PhysicalResourceId']と記述します。第二に、Xの子どもたちにXの親を返すようなビザのような動作をしていると書いているのはいいのですが、私の混乱は妥当かどうか、それを混同してはいけない理由があります。 –

+0

私は、代替の修正をハッキングしました。つまり、PhysicalResourceIDからスタックの名前を抜き出しました。 –

+0

[AWS :: CloudFormation :: Stack'](http://)のために、抜粋ルーチンが必要ではないと思います。 /docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html)リソース、 'PhysicalResourceID'(返されるもの)(http://docs.aws.amazon.com/AWSCloudFormation/最新の/ UserGuide/aws-properties-stack.html#d0e43649)['Ref'](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)テンプレート内の組み込み関数)_is_スタックID、 'DescribeStackResources'の' StackName'には、スタックの名前かスタックIDのいずれかを指定できます。 – wjordan

関連する問題