Exemplarische Änderungssätze - AWS CloudFormation

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 aus einem Stack generiert:

{ "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 Feld ChangeSource. In diesem Beispiel entspricht das ChangeSource-Feld der ParameterReference. Das bedeutet, dass diese Änderung das Ergebnis eines aktualisierten Parameterreferenzwerts ist. Der Änderungssatz muss eine ähnliche Dynamic-Bewertungsänderung enthalten.

  • Sie finden die passende Dynamic-Bewertung, indem Sie die Target-Struktur für beide Änderungen vergleichen, die dieselben Informationen enthalten wird. In diesem Beispiel enthalten die Target-Strukturen für beide Änderungen dieselben Werte für die Felder Attribute und RequireRecreation.

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.