Blog
Die Auswirkung der YAML Function Kurzschrift auf Ihre CloudFormation ChangeSet Auswertung

Erwägen Sie die Konvertierung von CloudFormation-Quellen von JSON nach YAML? Wenn Sie cfn-flip oder cfnflip.com verwenden, werden Ihre Funktionen höchstwahrscheinlich in die Kurzschreibweise konvertiert. Dieser Blogbeitrag soll Sie vor etwas warnen, das mir heute begegnet ist. Nach der Konvertierung von JSON in YAML mit Shorthand sagte mir die Change Set-Auswertung, dass einige Ressourcen ersetzt werden! Das ist natürlich nicht das, was ich wollte, und auch nicht das, was ich erwartet hätte! Dies ist ein Beispiel für die ursprüngliche Vorlage, die in JSON geschrieben wurde, bereits eingesetzt wird und von anderen Stacks intensiv genutzt wird.
{
"Resources": {
"MyVPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/20"
}
},
"MySubnet": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "MyVPC"
},
"CidrBlock": {
"Fn::Select": [
0,
{
"Fn::Cidr": [
{
"Fn::GetAtt": [
"MyVPC",
"CidrBlock"
]
},
16,
8
]
}
]
}
}
}
}
}
Wenn ich diese Vorlage in YAML konvertiere, wird die folgende Vorlage erzeugt. Weniger Zeilen, die Möglichkeit für Inline-Kommentare und vor allem: leichter zu lesen, vor allem wegen der Kurzschreibweise der Funktionen. Einverstanden?
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/20
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref 'MyVPC'
CidrBlock: !Select
- 0
- !Cidr
- !GetAtt 'MyVPC.CidrBlock'
- 16
- 8
Dann erstelle ich ein Change Set, um meine Änderungen zu bewerten. Ich erwarte, dass dies fehlschlägt, denn es sollte überhaupt keine Änderungen geben. Der nächste Screenshot hat mich dann doch sehr überrascht. Das Subnetz wird ersetzt!
Natürlich war meine Konvertierung etwas komplexer, so dass ich eine Weile brauchte, um herauszufinden, dass die Ursache in der Verwendung von Shorthand-Funktionen liegt. Wenn ich die YAML-Vorlage auf eine lange Syntax für die Funktionen umstelle (cfn-flip -long), erhalte ich die folgende Vorlage. Ein paar Zeilen mehr und, ehrlich gesagt, schwieriger zu lesen.
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/20
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: MyVPC
CidrBlock:
Fn::Select:
- 0
- Fn::Cidr:
- Fn::GetAtt:
- MyVPC
- CidrBlock
- 16
- 8
Bei der Erstellung eines neuen ChangeSet wird jetzt angezeigt: "FAILED - Die übermittelten Informationen enthalten keine Änderungen. Reichen Sie andere Informationen ein, um einen Änderungssatz zu erstellen." . Genau das habe ich erwartet!
Und wenn Sie der Vorlage eine neue Eigenschaft hinzufügen, wie z.B. Tags, wird diese geändert und nicht ersetzt. Ich empfehle wirklich, zumindest
Oder (achten Sie auf den Falschen):
Und die Details der Änderung:
[
{
"resourceChange": {
"logicalResourceId": "MySubnet",
"action": "Modify",
"physicalResourceId": "subnet-054e",
"resourceType": "AWS::EC2::Subnet",
"replacement": "False",
"details": [
{
"target": {
"name": null,
"requiresRecreation": "Never",
"attribute": "Tags"
},
"causingEntity": null,
"evaluation": "Static",
"changeSource": "DirectModification"
}
],
"scope": [
"Tags"
]
},
"type": "Resource"
}
]
Fazit
Denken Sie daran, dass Sie bei der Umwandlung von JSON in YAML die Kurzschrift nicht verwenden können, es sei denn, Sie möchten die Ressourcen ersetzen oder den gesamten Stack erneut bereitstellen. Beginnen Sie außerdem alle Ihre neuen Projekte entweder in JSON oder YAML und bleiben Sie bei dieser Entscheidung. Ob es Ihnen nun gefällt oder nicht. Ich empfehle Ihnen dringend, zusammen mit der Umstellung von JSON auf YAML etwas zu ändern, um sicherzustellen, dass Sie die Migration erfolgreich durchgeführt haben und es später keine Überraschungen gibt. Ich bin nicht sicher, ob dies nur für diese spezifische Funktion / Ressource / Eigenschaft gilt, werde es aber herausfinden und entsprechend aktualisieren.
Verfasst von
Martijn van Dongen
Unsere Ideen
Weitere Blogs
Contact



