Wie kann ich CloudFormation-Vorlagen schnell und effektiv debuggen?


83

CloudFormation ist ein leistungsstarkes AWS-Angebot, mit dem AWS-Ressourcenstapel programmgesteuert erstellt werden können, z. B. die Webschicht einer Anwendung, eines Hochleistungscomputerclusters oder eines gesamten Anwendungsstapels mit einem einzigen API-Aufruf. Es ist immens mächtig. Die Verwendung wird sicherlich als eine gute AWS-Praxis angesehen, insbesondere wenn sie mit Chef, Puppet oder Cloud-Init kombiniert wird . Das Debuggen bringt mich zum Laster.

Nehmen Sie ein Produktionsbeispiel: Die Standard-Mongodb-Cluster-Vorlagen funktionieren bei mir nicht. Ich weiß nicht besonders warum. Ich bin sicher, es ist etwas Einfaches, wie es fast immer ist. Mein Problem ist nicht, dass ich nicht herausfinden kann, was los ist. Es dauert so, dass der Stapel zwischen 20 und 30 Minuten benötigt, um fehlzuschlagen, und dann weitere drei oder vier Minuten, um ihn zu löschen, vorausgesetzt, er löscht die Ressourcen überhaupt ordnungsgemäß.

Was vermisse ich? Ich kenne die --disable-rollbackFlagge und benutze sie wie Sauerstoff. Ich habe vor langer Zeit gelernt, Ausgangsnachrichten mit zu verpacken cfn-signalund sie wie Ballast von einem sinkenden Schiff zu werfen. Wie kann ich den Vorlagen-Debugging-Prozess beschleunigen oder stecke ich meine Fehler eine halbe Stunde nach ihrer Erstellung für immer fest?


3
Selbst Tippfehler im JSON werden manchmal erst nach mehr als 10 Minuten im Erstellungsprozess abgefangen, da nicht bemerkt wird, dass ein bestimmter Ressourcentyp keinen bestimmten Attributnamen hat, bis er versucht, diese Ressource zu starten.
Eric Hammond

1
Meine Favoriten in keiner bestimmten Reihenfolge: Wenn Sie den Ressourcenkontext wechseln und auf fast, aber nicht ganz identische Attribute stoßen, vergessen Sie, ein Escape-Anführungszeichen in eine Benutzerskript-Deklaration einzufügen, und alles, was mit VolumeAttachments zu tun hat, da diese gelegentlich fehlschlagen überhaupt kein Grund.
Christopher

1
+1 für die Erwähnung "Deaktivieren des automatischen Rollbacks" - dies war fantastisch, um bessere Fehlermeldungen für Teilstapel zu erhalten
izikandrw

1
Ich habe festgestellt, dass Fehler in Richtliniensegmenten dazu führen, dass Dinge wie BucketPolicy für immer in der CREATE-Phase stecken bleiben - wenn etwas in CREATE steckt, beginnen Sie dort.
Eric Nord

Antworten:


46

Verwenden Sie den aws cloudformation validate-templateBefehl im AWS CLI-Tool. Es wird nur überprüft, ob Ihre Vorlage JSON oder YAML ist, nicht, ob Ihre Schlüssel und Werte korrekt sind (z. B. wird nicht nach Tippfehlern in Schlüsseln gesucht).


1
Dies ist auch in der einheitlichen cli docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
mp3foley

7
Dies ist übrigens aws cloudformation validate-templatein den neuen AWS CLI-Tools der Fall .
Christopher

8
Für alle, die 2017+ auf diese Frage stoßen, ist dies jetzt aws cloudformation validate-templateund es wird nur überprüft, ob Ihre Vorlage JSON oder YAML gültig ist, nicht, ob Ihre Schlüssel und Werte korrekt sind (z. B. wird nicht nach Tippfehlern in Schlüsseln gesucht).
Daniel Kats

1
Aus irgendeinem Grund scheint es die Zeilenlänge zu ignorieren, z Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. Laut validate-templateBefehl war dies kein Problem, aber die Benutzeroberfläche gibt diesen Fehler zurück.
030

2
Wenn dieses Tool nur eine Dateiformatüberprüfung durchführt, ist dies nicht der Fall. jsonlint oder yamllint ausreichend? Außerdem hat dieses Tool die Beschränkung der Dateigröße auf 51.200 Bytes.
Siva Senthil

23

Eine weitere Option, ein Jahr später, besteht darin, diese Vorlagen in eine Bibliothek eines Drittanbieters wie Troposphäre zu abstrahieren . Diese Bibliothek erstellt die JSON-Nutzdaten für Sie und führt unterwegs zahlreiche Überprüfungen durch. Dies löst auch das Problem "Wow, das Verwalten einer JSON-Datei mit 1000 Zeilen ist sicher traurig" .


3
"Wow, das Verwalten einer JSON-Datei mit 1000 Zeilen ist sicher traurig" - sicherlich wurde deshalb verschachtelte Stapel erstellt? ;-) Obwohl ich zustimme - Troposphere ist aws-some!
YFP

10

Wie kann ich den Vorlagen-Debugging-Prozess beschleunigen oder stecke ich meine Fehler eine halbe Stunde nach ihrer Erstellung für immer fest?

Im Folgenden finden Sie einige Best-Practice-Vorschläge, die sich speziell auf die Verbesserung der Iterationsgeschwindigkeit komplexer CloudFormation-Vorlagenentwicklungen konzentrieren:

Verwenden Sie CloudFormation-Tools, um Vorlagen und Stapelaktualisierungen zu überprüfen

AWS hat diese bereits in einem eigenen Best Practices- Dokument beschrieben, daher werde ich sie nicht wiederholen:

Der Zweck dieses Schritts besteht darin, offensichtliche Syntax- oder logische Fehler zu erkennen, bevor tatsächlich eine Stapelerstellung / -aktualisierung durchgeführt wird.

Testressourcen isoliert

Bevor Sie eine einzelne CloudFormation-Ressource in einem komplexen Stapel verwenden, stellen Sie sicher, dass Sie das gesamte Ausmaß des Erstellungs- / Aktualisierungs- / Löschverhaltens dieser Ressource einschließlich etwaiger Nutzungsbeschränkungen und typischer Start- / Abbauzeiten genau kennen, indem Sie deren Verhalten in kleineren, eigenständigen Stapeln testen zuerst.

  • Wenn Sie benutzerdefinierte Ressourcen von Drittanbietern entwickeln oder verwenden, schreiben Sie Komponententests mit geeigneten Bibliotheken für die Sprachplattform, um sicherzustellen, dass sich die Anwendungslogik in allen Anwendungsfällen wie erwartet verhält.
  • Beachten Sie, dass die Zeit, die eine einzelne Ressource zum Erstellen / Aktualisieren / Löschen benötigt, je nach Verhalten der zugrunde liegenden API-Aufrufe zwischen den Ressourcentypen stark variieren kann. Beispielsweise AWS::CloudFront::Distributionkann das Erstellen / Aktualisieren / Löschen einer komplexen Ressource manchmal 30 bis 60 Minuten dauern , während eine AWS::EC2::SecurityGroupAktualisierung in Sekunden erfolgt.
  • Einzelne Ressourcen können Fehler / Probleme / Einschränkungen in ihrer Implementierung aufweisen, die viel einfacher zu debuggen und Problemumgehungen zu entwickeln sind, wenn sie isoliert getestet werden, als in einem viel größeren Stapel. Beachten Sie Einschränkungen wie AWS- Servicelimits in Abhängigkeit von Ihren individuellen AWS-Kontoeinstellungen oder die Verfügbarkeit von Diensten in der Region in Abhängigkeit von der Region, in der Sie Ihren Stack erstellen.

Erstellen Sie komplizierte Stapel in kleinen Schritten

Wenn Sie eine Stapelerstellung / -aktualisierung durchführen, führt ein Fehler in einer einzelnen Ressource dazu, dass der Stapel den gesamten Satz von Ressourcenänderungen zurücksetzt. Dies kann andere erfolgreich erstellte Ressourcen unnötig zerstören und beim Erstellen eines komplizierten Stapels mit einer langen Ressource sehr lange dauern Abhängigkeitsdiagramm der zugehörigen Ressourcen.

Die Lösung hierfür besteht darin, Ihren Stapel schrittweise in kleineren Update-Stapeln zu erstellen und jeweils eine (oder mehrere) Ressourcen hinzuzufügen. Auf diese Weise führt das Rollback bei einem Fehler bei der Erstellung / Aktualisierung von Ressourcen nicht dazu, dass die Ressourcen Ihres gesamten Stacks zerstört werden, sondern nur die Ressourcen, die im letzten Update geändert wurden.

Überwachen Sie den Fortschritt der Stapelaktualisierungen

Stellen Sie sicher, dass Sie den Fortschritt Ihrer Stapelaktualisierung überwachen, indem Sie die Ereignisse des Stapels anzeigen, während eine Erstellung / Aktualisierung durchgeführt wird. Dies ist der Ausgangspunkt für das Debuggen weiterer Probleme mit einzelnen Ressourcen.


Über CloudFront und wie lange es dauert, wissen Sie trotzdem, dass der Stack vollständig ist, ohne zu warten. Ich möchte die Ausgaben erhalten, muss aber nicht warten, bis die Distribution in meinem Fall bereitgestellt wird
mcfedr


5

Spät zur Party, aber ich möchte auch hinzufügen, dass es sich lohnt, ein wenig Zeit damit zu verbringen, Ihren Editor zu konfigurieren und zu lernen. Ich weiß, das klingt als Antwort lächerlich einfach, aber probieren Sie es aus.

In meinem Fall habe ich mit vim viel besser abgeschnitten, nachdem ich einige Zeit mit der Installation von JSON-Syntax-Plugins verbracht hatte, und (endlich) die Falttechniken verstanden, um große CF-Dateien einfach zu navigieren. Meins schlägt jetzt Tippfehler vor (Kommas, wo sie nicht sein sollten usw.), und die Hervorhebung von Farben spart viel Zeit und gibt klare visuelle Hinweise.

Dies kann dazu beitragen, Syntaxfehler zu verringern. Logische Fehler in der Vorlage werden jedoch besser von anderen Tools behoben. Hoffentlich wird es eines Tages einen "Vorschau" -Modus für CF geben.


1
Kein lächerlicher Vorschlag. Ich bin nicht sicher, ob ich ohne Hervorhebung der Syntax codieren könnte.
Christopher

2
Es gibt eine Vorschau für CFN, die alle Ressourcen anzeigt, die Sie erstellen möchten, und die Ihnen auch sagt, wie viel Ihr Stack kosten wird. Ich verwende die Java-API, bin mir also nicht sicher, ob sie auf der CLI verfügbar ist, aber versuche
Folgendes

4

Für JetBrains-IDEs (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio) gibt es das AWS CloudFormation- Plugin, das die eingehende Überprüfung von JSON- und YAML-CFN-Vorlagen unterstützt


4

Der AWS CloudFormation-Linter bietet darüber hinaus zusätzliche statische Analysenaws cloudformation validate-template

Sie werden darüber informiert, welche Ressourcentypen und Instanztypen in bestimmten Regionen nicht verfügbar sind, Eigenschaftswerte anhand zulässiger Werte validieren, zirkuläre Ressourcenabhängigkeiten, Syntaxfehler, Vorlagenbeschränkungen und vieles mehr abfangen

Neben der CLI ist die Installation eines Editor-Plugins wie der Visual Studio Code-Erweiterung, die bei jedem Speichern von Dateien ausgeführt wird , einer der beliebtesten Mechanismen, um sich daran zu erinnern, den Linter auszuführen

Andere Mechanismen wie Git-Hooks vor dem Festschreiben werden hier beschrieben

Beispiel für einen Screenshot der Visual Studio Code-Erweiterung


2

Wenn Sie mit EC2-Computern arbeiten, würde ich Ihnen empfehlen, sich am EC2-Computer anzumelden und die Datei boot.log (/var/log/boot.log in RHEL6 / Centos) zu beenden. Diese Datei wird mit all Ihren Shell-Aktivitäten aktualisiert (Aktivitäten wie Installation, Herunterladen von Dateien, Kopieren von Dateien usw.).

Verwenden Sie auch Editoren wie http://www.jsoneditoronline.org/ , um eine TREE-Darstellung Ihres JSON zu erhalten. Auf diese Weise können Sie die Reihenfolge der JSON-Elemente überprüfen.

Und wenn Sie Dateien aktualisieren, verwenden Sie immer Tools wie http://www.git-tower.com/blog/diff-tools-mac/ oder ein aktuelles Versionskontrollsystem, um sicherzustellen, dass Sie nicht versehentlich etwas geändert haben, das Ihr Skript beschädigen könnte.



1

Eine neue Funktion, die Cloudformation im vergangenen Dezember hinzugefügt wurde, war das Hinzufügen zusätzlicher Parametertypen . Mit diesen neuen Typen können Ihre Vorlagen eine stärkere Datenprüfung durchführen und beim Erstellen von Ressourcen und verschachtelten Cloudformation-Stapeln "ausfallsicher" sein. Sie haben auch die Möglichkeit, besser lesbare benutzerdefinierte Fehlermeldungen bereitzustellen, wenn ungültige Werte mithilfe des neuen ConstraintDescription-Attributs übergeben werden .

Die neuen Typen sind besonders hilfreich beim Umgang mit verschiedenen VPC-Ressourcen. Sie können sicherstellen, dass die Parameter für Ihre Vorlagen vom richtigen Typ sind und explizit einen einzelnen Wert gegenüber einer Liste erwarten.

Zum Beispiel:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}

1

Bitte überprüfen Sie meinen Cloudformation Validator unter https://pypi.org/project/cloudformation-validator/

Dadurch wird das Schema überprüft und anschließend eine Liste von Regeln erneut überprüft. Außerdem werden benutzerdefinierte Regeln berücksichtigt. Ich erlaube auch eine einfache Integration mit Bereitstellungstools.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.