Ist es möglich, die Neuerstellung einer EC2- oder RDS-Instanz mithilfe von Cloudformationsstacks zu erzwingen?
Mein Stack bleibt an einem Punkt hängen, an dem es durch einfaches Zerstören und Erstellen der Ressource behoben wird. Stattdessen musste ich den gesamten Stack löschen, um die Arbeit fortzusetzen.
bearbeiten:
Dieses Problem traf mich zweimal. Zuerst habe ich eine AWS :: RDS :: -Instanz mit einigen Standardeinstellungen erstellt und dann versucht, sie auf "EngineVersion": "5.5" herunterzustufen. Dies zu ändern, sollte mit Unterbrechungen geschehen, aber mysql-Instanzen können nicht von 5.6 auf 5.5 herabgestuft werden, sodass der Stack im Status UPDATE_FAILED belassen wurde und ich RDS nicht ohne einen üblen Trick neu erstellen kann.
Das andere Vorkommen war, dass ich mehrere "AWS :: EC2 :: Instance" habe, die ein Skript von "UserData" herunterladen und ausführen. Wenn Sie das heruntergeladene Skript ändern, muss ich die Instanz zurücksetzen, und es gibt keine Möglichkeit, dies zu tun. Ich benutze wieder den gleichen bösen Trick, um die Maschine neu zu erstellen.
Der böse Trick:
Anstatt eine Autoscaling-Gruppe von einem Computer zu verwenden, habe ich beide Probleme gelöst, indem ich die Verfügbarkeitszone in den Eigenschaften geändert habe ... aber ich hatte einen schlechten Geschmack
cfn-hup
: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…Antworten:
Ein Trick bei Instanzen, die durch einen Instanzspeicher unterstützt werden, besteht darin, dem Benutzerdatenskript einen Kommentar hinzuzufügen, der eine Versionsnummer, ein Datum oder Ähnliches enthält, und dies dann zu ändern, wann immer Sie die Instanz neu erstellen möchten:
Bei jeder Änderung von
UserData
wird die Instanz ersetzt (dh neu generiert). Das Verhalten des Benutzerdatenskripts sollte jedoch dasselbe sein, da die einzige Änderung ein Kommentar ist. Beachten Sie, dass dies für EBS-gestützte Instanzen nicht funktioniert.Für RDS können Sie einen DB-Snapshot der aktuellen RDS-Instanz erstellen und dann Ihre Vorlage so ändern, dass dieser Snapshot verwendet wird mit
DBSnapshotIdentifier
:Bei jeder
DBSnapshotIdentifier
Änderung wird die Datenbankinstanz ersetzt. Durch die Verwendung von Schnappschüssen können Sie auch die Daten aus der Zeit speichern, als der Schnappschuss erstellt wurde. (Wenn Sie die Daten löschen möchten , können Sie einen leeren Snapshot erstellen und diesen als Eingabe übergeben. Oder den gesamten CloudFormation-Stapel löschen und neu erstellen.)Ein allgemeinerer Ansatz besteht darin, den logischen Namen der Ressource zu ändern. So ändern Sie eine Stapelvorlage in den CloudFormation-Dokumenten:
quelle
Wenn Sie es in eine AutoScalingGroup einfügen, können Sie die AutoScalingGroup min / max / default auf 0 setzen. Sobald die alte Instanz zerstört wird, können Sie die min / max / default auf 1/1/1 und setzen presto: neue Instanz.
quelle
Wenn sich Ihr EC2 in einer AutoScalingGroup befindet, können Sie die
AutoScalingGroupName
Eigenschaft mit einer Versionsnummer festlegen .Jedes Mal, wenn Sie diese Versionsnummer ändern, wird CFN: 1. eine neue Auto-Scaling-Gruppe erstellen und die gewünschten Instanzen hochfahren. 2. Instanzen in der alten Auto-Scaling-Gruppe beenden und löschen
Hier ist ein Stück Code aus meinem Stapel, in dem ich diese Technik verwende, um eine große Anzahl von EC2-Maschinen zu zwingen, neue Software von S3 neu zu erstellen und automatisch abzurufen.
quelle