Czy można wymusić ponowne utworzenie EC2 :: Instance lub RDS :: DBInstance w Amazon Cloudformation?

16

Czy można wymusić ponowne utworzenie instancji EC2 lub RDS przy użyciu stosów chmur obliczeniowych?

Mój stos utknął w punkcie, w którym zwykłe zniszczenie i utworzenie zasobu go naprawi, zamiast tego musiałem usunąć cały stos, aby kontynuować pracę.

edytować:

Ten problem uderzył mnie dwa razy. Najpierw utworzyłem instancję AWS :: RDS :: z pewnymi ustawieniami domyślnymi, a następnie próbowałem obniżyć ją do wersji „EngineVersion”: „5.5”. Zmiana powinna mieć miejsce z pewną przerwą, ale instancji mysql nie można obniżyć z 5.6 do 5.5, więc stos pozostawiono w stanie UPDATE_FAILED i nie mogę odtworzyć RDS bez nieprzyjemnej sztuczki.

Innym zjawiskiem było to, że mam kilka „AWS :: EC2 :: Instancja”, która pobiera i wykonuje skrypt z jego „UserData”, oczywiście jeśli Y zmieni pobrany skrypt, muszę odtworzyć instancję i nie ma na to sposobu. Ponownie używam tej samej paskudnej sztuczki, aby odtworzyć maszynę.

Paskudna sztuczka:

Zamiast korzystać z grupy automatycznego skalowania jednej maszyny, rozwiązałem oba problemy zmieniając strefę dostępności we właściwościach ... ale zostawiłem mi zły smak

teista
źródło
Potrzebujesz więcej informacji, aby odpowiedzieć. Czy Twoje instancje zawieszają się podczas uruchamiania? Czy usługa przestaje odpowiadać? Jeśli chcesz ręcznie odtworzyć instancję EC2, możesz utworzyć grupę automatycznego skalowania za pomocą jednej instancji. Po zakończeniu wystąpienia zostanie utworzona kolejna.
Edwin,
edytowane dla wyjaśnienia. Poprosiłem również tutaj: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
Theist
To nie odpowiada bezpośrednio na twoje pytanie, ale aby ponownie uruchomić skrypty UserData po zmianie, możesz zajrzeć na cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/...
Reed Kraft-Murphy

Odpowiedzi:

10

Na przykład w przypadku instancji EC2 wspieranych przez sklep jedną sztuczką jest dodanie komentarza do skryptu danych użytkownika zawierającego numer wersji, datę lub podobny, a następnie zmienić go, gdy chcesz ponownie utworzyć instancję:

{
    "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 ...
                    ]]}
            }
        }
    }
}

Każda zmiana UserDataspowoduje, że instancja zostanie zastąpiona (tj. Zregenerowana). Zachowanie skryptu danych użytkownika powinno być takie samo, ponieważ jedyną modyfikacją jest komentarz. Pamiętaj, że nie działa to w przypadku instancji wspieranych przez EBS.

W przypadku RDS możesz zrobić migawkę DB bieżącej instancji RDS, a następnie zmodyfikować szablon, aby użyć tej migawki z DBSnapshotIdentifier:

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

Po każdej DBSnapshotIdentifierzmianie instancja bazy danych zostanie zastąpiona. Korzystanie z migawek pozwoli również zachować dane od momentu utworzenia migawki. (Jeśli chcesz wyczyścić dane, możesz utworzyć pustą migawkę i przekazać ją jako dane wejściowe. Lub usunąć i ponownie utworzyć cały stos CloudFormation.)

Bardziej ogólne podejście polega na zmianie logicznej nazwy zasobu. Z Modyfikacji szablonu stosu w dokumentach CloudFormation:

W przypadku większości zasobów zmiana logicznej nazwy zasobu jest równoważna usunięciu tego zasobu i zastąpieniu go nowym. Wszelkie inne zasoby zależne od zasobu o zmienionej nazwie również wymagają aktualizacji i mogą spowodować ich zastąpienie. Inne zasoby wymagają aktualizacji właściwości (nie tylko nazwy logicznej) w celu uruchomienia aktualizacji.

markusk
źródło
Wydaje się, że jedynym rozwiązaniem jest robienie „brudnych sztuczek”. Podobne rozwiązanie (wymuszanie zmian stref dostępności) osiągnąłem jakiś czas po zapytaniu :)
teista
4
Chcę tylko zaznaczyć, że instancja została zastąpiona, a zatem UserData jest wykonywana, gdy instancja EC2 jest przechowywana w magazynie instancji. Jeśli jest on wspierany przez EBS, zmiana UserData spowoduje tylko ponowne uruchomienie instancji i UserData nie zostanie ponownie wykonany. Możesz użyć cfn-hup, aby ponownie uruchomić UserData, nawet w tym przypadku, ale instancja pozostaje ta sama.
Kaitsu
@Kaitsu: Dzięki, to bardzo cenne wyjaśnienie. Zaktualizowałem odpowiednio swoją odpowiedź.
markusk
@Kaitsu, ale jeśli ręcznie ponownie uruchomisz skrypt (znajdujący się w katalogu / var / lib / cloud / instance / scripts / part-001), musisz upewnić się, że skrypt jest
odporny na
1

Jeśli umieścisz go w AutoScalingGroup, możesz edytować AutoScalingGroup min / max / default na 0, a gdy tylko zacznie on niszczyć starą instancję, możesz ustawić min / max / default na 1/1/1 i presto: nowa instancja.

Tim Bassett
źródło
0

Jeśli twoje EC2 są w grupie AutoScalingGroup, możesz ustawić AutoScalingGroupNamewłaściwość z numerem wersji.

Za każdym razem, gdy zmienisz ten numer wersji, CFN: 1. utworzy nową grupę automatycznego skalowania i rozpali pożądane wystąpienia 2. zabija wystąpienia w starej grupie automatycznego skalowania i usuwa ją

Oto fragment kodu z mojego stosu, w którym używam tej techniki, aby zmusić dużą liczbę komputerów EC2 do odtworzenia i automatycznego pobrania nowego oprogramowania z S3.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
marcopeg
źródło