Ist es möglich, die Neuerstellung von EC2 :: Instance oder RDS :: DBInstance in amazon cloudformation zu erzwingen?

16

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

Theist
quelle
Benötigen Sie weitere Informationen, um zu antworten. Frieren Ihre Instanzen beim Start ein? Reagiert ein Dienst nicht mehr? Wenn Sie eine EC2-Instanz manuell neu erstellen möchten, können Sie eine Auto-Scaling-Gruppe mit einer Instanz erstellen. Wenn Sie die Instanz beenden, wird eine weitere erstellt.
Edwin
bearbeitet zur Verdeutlichung. Ich fragte auch hier: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
theist
Dies beantwortet Ihre Frage nicht direkt, aber Sie können nachlesen, ob Sie UserData-Skripte nach einer Änderung erneut ausführen möchtencfn-hup : docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Reed Kraft-Murphy

Antworten:

10

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:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

Bei jeder Änderung von UserDatawird 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:

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

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:

Bei den meisten Ressourcen entspricht das Ändern des logischen Namens einer Ressource dem Löschen und Ersetzen dieser Ressource durch eine neue. Alle anderen Ressourcen, die von der umbenannten Ressource abhängen, müssen ebenfalls aktualisiert werden und können zu deren Ersetzung führen. Bei anderen Ressourcen müssen Sie eine Eigenschaft (nicht nur den logischen Namen) aktualisieren, um eine Aktualisierung auszulösen.

Markusk
quelle
Scheint, dass die einzige Lösung ist, "schmutzige Tricks" zu machen. Ich erreichte eine ähnliche Lösung (erzwingen von Änderungen der Verfügbarkeitszonen) einige Zeit nach der Frage :)
Theist
4
Ich möchte nur darauf hinweisen, dass die Instanz ersetzt und somit die UserData ausgeführt werden, wenn die EC2-Instanz instanzenspeichergestützt ist. Wenn es von EBS unterstützt wird, wird durch die Änderung von UserData nur die Instanz neu gestartet und UserData wird nicht erneut ausgeführt. Sie können cfn-hup verwenden, um die UserData auch in diesem Fall erneut auszuführen, aber die Instanz bleibt gleich.
Kaitsu
@ Kaitsu: Danke, das ist eine sehr wertvolle Erklärung. Ich habe meine Antwort entsprechend aktualisiert.
Markusk
@Kaitsu, aber wenn Sie das Skript manuell erneut ausführen (unter / var / lib / cloud / instance / scripts / part-001), müssen Sie sicherstellen, dass das Skript nicht mehrmals dieselben Befehle ausführen kann :(
c24w
1

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.

Tim Bassett
quelle
0

Wenn sich Ihr EC2 in einer AutoScalingGroup befindet, können Sie die AutoScalingGroupNameEigenschaft 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.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
marcopeg
quelle