Exemplarische Änderungssätze
Dieser Abschnitt bietet Beispiele für Änderungssätze, die CloudFormation für gängige Stack-Änderungen erstellen würde. Sie zeigen, wie Sie eine Vorlage direkt bearbeiten, ein einzelnes Eingabeparameter modifizieren, Ressourcenantworten planen (Austausch), um zu verhindern, dass Sie Daten verlieren, die nicht gesichert wurden, oder dass Anwendungen unterbrochen werden, die in Ihrem Stapel ausgeführt werden, und wie Sie Ressourcen hinzufügen oder entfernen. Um zu veranschaulichen, wie Änderungssätze funktionieren, führen wir Sie schrittweise durch die eingereichten Änderungen und besprechen den Änderungssatz, der sich daraus ergibt. Da jedes Beispiel auf dem vorherigen Beispiel aufbaut und voraussetzt, dass Sie das vorherige Beispiel verstanden haben, empfehlen wir Ihnen, die Beispiele der Reihe nach zu lesen. Eine Beschreibung der einzelnen Felder in einem Änderungssatz finden Sie unter Ändern des Datentyps im AWS CloudFormation API Reference.
Verwenden Sie die Konsole, die AWS CLI oder die CloudFormation-API, um Details von Änderungssätzen anzuzeigen.
Wir haben die folgenden Änderungssätze mit folgender Beispielvorlage
{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "A sample EC2 instance template for testing change sets.", "Parameters" : { "Purpose" : { "Type" : "String", "Default" : "testing", "AllowedValues" : ["testing", "production"], "Description" : "The purpose of this instance." }, "KeyPairName" : { "Type": "AWS::EC2::KeyPair::KeyName", "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance" }, "InstanceType" : { "Type" : "String", "Default" : "t2.micro", "AllowedValues" : ["t2.micro", "t2.small", "t2.medium"], "Description" : "The EC2 instance type." } }, "Resources" : { "MyEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "KeyName" : { "Ref" : "KeyPairName" }, "InstanceType" : { "Ref" : "InstanceType" }, "ImageId" : "ami-8fcee4e5", "Tags" : [ { "Key" : "Purpose", "Value" : { "Ref" : "Purpose" } } ] } } } }
Direktes Bearbeiten einer Vorlage
Wenn Sie Ressourcen direkt in der Stack-Vorlage ändern, um einen Änderungssatz zu erstellen, klassifiziert CloudFormation die Änderung als direkte Änderung und nicht als Änderungen, die durch einen aktualisierten Parameterwert ausgelöst wurden. Der folgende Änderungssatz, durch den der i-1abc23d4
Instance ein neuer Tag hinzugefügt wurde, ist ein Beispiel für eine direkte Änderung. Alle anderen Eingabewerte, wie die Parameterwerte und Fähigkeiten, bleiben unverändert, sodass wir uns auf die Changes
-Struktur konzentrieren.
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-direct", "Parameters": [ { "ParameterValue": "testing", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "False" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T23:35:25.813Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-direct/1a2345b6-0000-00a0-a123-00abc0abc000" }
In der Changes
-Struktur gibt es nur eine ResourceChange
-Struktur. Diese Struktur beschreibt Informationen wie den Typ der Ressource, die CloudFormation ändern wird, die Aktion, die CloudFormation durchführen wird, die ID der Ressource, den Umfang der Änderung und ob die Änderung einen Ersatz erfordert (wobei CloudFormation eine neue Ressource erstellt und die alte Ressource löscht). In diesem Beispiel gibt der Änderungssatz an, dass CloudFormation das Tags
-Attribut der i-1abc23d4
-EC2-Instance ändern wird, und die Instance muss nicht ersetzt werden.
In der Details
-Struktur kennzeichnet CloudFormation diese Änderung als direkte Änderung, die keine Neuerstellung (keinen Austausch) der Instance erfordert. Sie können diese Änderung ruhigen Gewissens ausführen, da Sie wissen, dass CloudFormation die Instance nicht ersetzen wird.
CloudFormation zeigt diese Änderung als Static
-Bewertung. Eine statische Bewertung bedeutet, dass CloudFormation den Tag-Wert vor der Ausführung des Änderungssatzes festlegen kann. In einigen Fällen kann CloudFormation einen Wert erst bestimmen, nachdem Sie einen Änderungssatz ausgeführt haben. CloudFormation kennzeichnet diese Änderungen als Dynamic
-Bewertungen. Wenn Sie beispielsweise auf eine aktualisierte Ressource verweisen, die bedingt ersetzt wurde, kann CloudFormation nicht feststellen, ob sich der Verweis auf die aktualisierte Ressource ändern wird.
Einen Eingabeparameterwert ändern
Wenn Sie einen Eingabeparameterwert ändern, generiert CloudFormation zwei Änderungen für jede Ressource, die den aktualisierten Parameterwert verwendet. In diesem Beispiel heben wir hervor, wie diese Änderungen aussehen und auf welche Informationen Sie sich konzentrieren sollten. Das folgende Beispiel wurde nur durch Änderung des Werts des Purpose
-Eingabeparameters erzeugt.
Der Purpose
-Parameter gibt einen Tag-Schlüsselwert für die EC2 Instance an. In diesem Beispiel wurde der Parameterwert von testing
in production
geändert. Der neue Wert wird in der Parameters
-Struktur angezeigt.
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet", "Parameters": [ { "ParameterValue": "production", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } }, { "CausingEntity": "Purpose", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "False" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T23:59:18.447Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000" }
Die Changes
-Struktur funktioniert ähnlich wie im Beispiel Eine Vorlage direkt bearbeiten. Es gibt nur eine ResourceChange
-Struktur. Sie beschreibt eine Änderung am Tags
-Attribut der i-1abc23d4
-EC2 Instance.
Doch in der Details
-Struktur zeigt der Änderungssatz zwei Änderungen für das Tags
-Attribut, auch wenn nur ein einzelner Parameterwert geändert wurde. Ressourcen, die auf einen geänderten Parameterwert verweisen (mithilfe der intrinsischen Ref
-Funktion) führen immer zu zwei Änderungen: eine mit einer Dynamic
-Bewertung und eine andere mit einer Static
-Bewertung. Sie können diese Arten von Änderungen sehen, indem Sie die folgenden Felder anzeigen:
-
Die Änderung der
Static
-Bewertung sehen Sie im FeldChangeSource
. In diesem Beispiel entspricht dasChangeSource
-Feld derParameterReference
. Das bedeutet, dass diese Änderung das Ergebnis eines aktualisierten Parameterreferenzwerts ist. Der Änderungssatz muss eine ähnlicheDynamic
-Bewertungsänderung enthalten. -
Sie finden die passende
Dynamic
-Bewertung, indem Sie dieTarget
-Struktur für beide Änderungen vergleichen, die dieselben Informationen enthalten wird. In diesem Beispiel enthalten dieTarget
-Strukturen für beide Änderungen dieselben Werte für die FelderAttribute
undRequireRecreation
.
Konzentrieren Sie sich für diese Art von Änderungen auf die statische Bewertung, die Ihnen die genauesten Informationen zur Änderung liefert. In diesem Beispiel zeigt die statische Bewertung, dass die Änderung das Ergebnis der Änderung eines Parameterreferenzwerts (ParameterReference
) ist. Der exakte Parameter, der geändert wurde, wird im Feld CauseEntity
(der Purpose
-Parameter) angezeigt.
Ermitteln des Werts des Ersatzfelds
Das Replacement
-Feld in einer ResourceChange
-Struktur zeigt an, ob CloudFormation die Ressource erstellen wird. Die Planung einer Ressourcen-Neuerstellung (Ersatz) verhindert den Verlust von Daten, die nicht gesichert wurden, oder die Unterbrechung von Anwendungen, die in Ihrem Stack ausgeführt werden.
Der Wert im Feld Replacement
hängt davon ab, ob eine Änderung einen Ersatz erfordert. Dies wird durch das Feld RequiresRecreation
in der Target
-Struktur einer Änderung angezeigt. Wenn beispielsweise der Wert des RequiresRecreation
-Felds Never
ist, wird der Wert des Replacement
-Felds False
. Wenn jedoch mehrere Änderungen an einer einzelnen Ressource vorgenommen werden sollen und jede Änderung einen anderen Wert für das Feld RequiresRecreation
aufweist, aktualisiert CloudFormation die Ressource mit dem intrusivsten Verhalten. Mit anderen Worten: Wenn nur eine der vielen Änderungen einen Ersatz erfordert, muss CloudFormation die Ressource ersetzen und setzt das Replacement
-Feld daher auf True
.
Der folgende Änderungssatz wurde durch Änderung der Werte für jeden einzelnen Parameter (Purpose
, InstanceType
und KeyPairName
) erzeugt, die alle von der EC2 Instance verwendet werden. Mit diesen Änderungen muss CloudFormation die Instance ersetzen, da das Feld Replacement
True
ist.
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-multiple", "Parameters": [ { "ParameterValue": "production", "ParameterKey": "Purpose" }, { "ParameterValue": "MyNewKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.small", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-7bef86f8", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Properties", "Name": "KeyName", "RequiresRecreation": "Always" } }, { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Properties", "Name": "InstanceType", "RequiresRecreation": "Conditionally" } }, { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } }, { "CausingEntity": "KeyPairName", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Properties", "Name": "KeyName", "RequiresRecreation": "Always" } }, { "CausingEntity": "InstanceType", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Properties", "Name": "InstanceType", "RequiresRecreation": "Conditionally" } }, { "CausingEntity": "Purpose", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags", "Properties" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "True" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T00:39:35.974Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-multiple/1a2345b6-0000-00a0-a123-00abc0abc000" }
Identifizieren Sie die Änderung, durch welche die Ressource ersetzt werden muss, indem Sie jede einzelne Änderung (die statischen Bewertungen in der Details
-Struktur) anzeigen. In diesem Beispiel hat jede Änderung einen anderen Wert für das Feld RequireRecreation
, aber die Änderung an der Eigenschaft KeyName
weist das stärkste verändernde Verhalten auf, da sie stets eine Neuerstellung erfordert. CloudFormation ersetzt die Instance, da der Schlüsselname geändert wurde.
Wäre der Schlüsselname unverändert geblieben, hätte die Änderung an der Eigenschaft InstanceType
das Aktualisierungsverhalten mit den größten Auswirkungen gehabt (Conditionally
), und das Feld Replacement
wäre Conditionally
. Um die Bedingungen zu finden, unter denen CloudFormation die Instance ersetzt, zeigen Sie das Aktualisierungsverhalten für die Eigenschaft InstanceType
an.
Hinzufügen und Entfernen von Ressourcen
Das folgende Beispiel wurde durch Einreichen einer geänderten Vorlage erzeugt, durch welche die EC2 Instance entfernt und eine Auto Scaling-Gruppe sowie eine Startkonfiguration hinzugefügt werden.
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-addremove", "Parameters": [ { "ParameterValue": "testing", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "Action": "Add", "ResourceType": "AWS::AutoScaling::AutoScalingGroup", "Scope": [], "Details": [], "LogicalResourceId": "AutoScalingGroup" }, "Type": "Resource" }, { "ResourceChange": { "Action": "Add", "ResourceType": "AWS::AutoScaling::LaunchConfiguration", "Scope": [], "Details": [], "LogicalResourceId": "LaunchConfig" }, "Type": "Resource" }, { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [], "Action": "Remove", "Scope": [], "LogicalResourceId": "MyEC2Instance" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T01:44:08.444Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-addremove/1a2345b6-0000-00a0-a123-00abc0abc000" }
In der Struktur Changes
gibt es drei ResourceChange
-Strukturen, eine für jede Ressource. Für jede Ressource zeigt das Feld Action
an, ob CloudFormation die Ressource hinzugefügt oder entfernt. Die Felder Scope
und Details
sind leer, da sie nur für geänderte Ressourcen gelten.
Für neue Ressourcen kann CloudFormation den Wert mancher Felder nicht bestimmen, bis Sie den Änderungssatz ausführen. Beispielsweise liefert CloudFormation nicht die physischen IDs der Auto Scaling-Gruppe und startet die Konfiguration, da sie noch nicht existieren. CloudFormation legt die neuen Ressourcen an, wenn Sie den Änderungssatz ausführen.