2017-01-11 2 views
0

Ich bin frustriert in meinen Versuchen, eine Hierarchie von AWS CloudFormation-Stapeln rekursiv zu durchlaufen. Ich muss mir alle ihre Ressourcen ansehen.Scannen der Ressourcen einer Hierarchie von Cloudformationsstapeln

Erinnern Sie sich, dass ein CloudFormation-Stapel noch einen weiteren Stapel enthalten kann.

Es scheint, dass die Beschreibung dieser Teilstapel, die von describe_stack_resources zurückgegeben werden, nicht sinnvoll ist.

Ein Beispiel für mein Problem folgt:

Boto3 verwenden, können wir dieser Stapel sehen hat acht Teilstapel:

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'] 

Seltsamerweise, all diese Teilstapel werden als mit den Namen der berichtet Eltern, die sie erstellt, obwohl sie verschiedene PhysicalResourceId s haben.

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 

Wenn ich für die Ressourcen des Unterstapels bitten, ihre physische ID verwenden es nicht funktioniert, habe ich stattdessen die Ressourcen des Mutter:

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 

Gibt es eine Abhilfe?

Antwort

0

Mit diesem Befehl werden die Ressourcen aller verschachtelten Stapeln Liste:

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

finden Sie in der DescribeStackResources API-Dokumentation für Details auf Anfrage Parameter/Response-Elemente für diese API.

In dem Antrag der StackName Parameter akzeptiert entweder den Namen oder seiner einzigartigen Stack ID Stack. Im Inner-Stack-Aufruf können Sie die PhysicalResourceId s der AWS::CloudFormation::Stack-Ressourcen bereitstellen, da die physische ID (die von der intrinsischen Funktion Ref zurückgegebene Zeichenfolge) defined als Stack-ID für diesen Ressourcentyp ist.

Beachten Sie, dass in der Antwort die StackResources.StackName Eigenschaft den Namen darstellt, der dem übergeordneten Stapel zugeordnet ist, nicht der Name des Stapels der Ressource, die beschrieben wird.

Beachten Sie auch, dass DescribeStackResources mit dem PhysicalResourceId Parameter Aufruf liefert alle Ressourcen des Mutter Stapel enthält, dass physische Ressourcen-ID, nicht die Ressourcen eines Stapels durch dargestellt, dass physische Ressourcen-ID, wie sie in der API beschrieben Dokumentation:

Gibt AWS-Ressourcenbeschreibungen für laufende und gelöschte Stapel zurück. Wenn StackName angegeben wird, werden alle zugeordneten Ressourcen zurückgegeben, die Teil des Stapels sind. Wenn PhysicalResourceId angegeben wird, werden die zugeordneten Ressourcen des Stapels, zu dem die Ressource gehört, zurückgegeben.

+0

Ok, das funktioniert; Vielen Dank! Aber zwei Dinge. Ich finde es sehr merkwürdig, dass Sie eine ID an einen Parameter übergeben, der einen Namen hat. Zuerst schreiben Sie StackName = x ['PhysicalResourceId'].Zweitens, während es nett ist, dass sie dokumentieren, was wie bizarres Verhalten aussieht, gibt die Frage nach den Kindern von X die Kinder des Elternteils von X zurück. Ist meine Verwirrung angemessen oder gibt es einen Grund, warum ich nicht verwirrt werden sollte. –

+0

Ich habe einen alternativen Fix gehackt, d. H. Den Namen des Stacks aus der PhysicalResourceID herausgezogen. stack_physical_resource_id.split (':') [5] .split ('/') [1] –

+0

Ich glaube nicht, dass die Zupfroutine notwendig ist - für ein ['AWS :: CloudFormation :: Stack '] (http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html) Ressource, die 'PhysicalResourceID' (was ist [returned] (http://docs.aws.amazon.com/AWSCloudFormation/ letzte/UserGuide/aws-Eigenschaften-stack.html # d0e43649) von der ['Ref'] (http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) intrinsische Funktion in einer Vorlage) _ist_ die Stack-ID und für 'DescribeStackResources'' StackName' können Sie entweder den Namen des Stacks oder seine Stack-ID angeben. – wjordan

Verwandte Themen