Jak mogę szybko i skutecznie debugować szablony CloudFormation?


83

CloudFormation to potężna oferta AWS, która umożliwia programowe tworzenie stosów zasobów AWS, takich jak warstwa internetowa aplikacji, klaster obliczeniowy o wysokiej wydajności lub cały stos aplikacji za pomocą jednego wywołania interfejsu API. Jest niezwykle potężny. Korzystanie z niego jest z pewnością uważane za dobrą praktykę AWS, zwłaszcza w połączeniu z Chef, Puppet lub cloud-init. Debugowanie prowadzi mnie do występku.

Weźmy przykład produkcyjny: standardowe szablony klastrów mongodb nie będą działać dla mnie. Nie wiem dokładnie, dlaczego. Jestem pewien, że to coś prostego, jak prawie zawsze. Mój problem nie polega na tym, że nie potrafię zrozumieć, co jest nie tak. Chodzi o to, że uszkodzenie stosu zajmuje od 20 do 30 minut, a następnie kolejne trzy lub cztery minuty na usunięcie, zakładając, że w ogóle usuwa zasoby.

czego mi brakuje? Wiem o --disable-rollbackfladze i używam jej jak tlenu. Już dawno nauczyłem się opakowywać wiadomości o wyjściu cfn-signali zrzucać je jak balast z tonącego statku. Jak mogę przyspieszyć proces debugowania szablonu, czy też utknąłem na zawsze, zauważając swoje błędy pół godziny po ich popełnieniu?


3
Nawet literówki w JSON czasami nie są wychwytywane przez ponad 10 minut w procesie kompilacji, ponieważ nie zauważa, że ​​określony typ zasobu nie ma określonej nazwy atrybutu, dopóki nie spróbuje uruchomić tego zasobu.
Eric Hammond

1
Moje ulubione w przypadkowej kolejności: gdy zmieniasz konteksty zasobów i napotykasz prawie-, ale nie do końca identyczne atrybuty, zapominając o dodaniu znaku cudzysłowu w deklaracji skryptu użytkownika i cokolwiek związanego z VolumeAttachments, ponieważ czasami zawodzą bez powodu.
Christopher

1
+1 za wzmiankę o „wyłączaniu automatycznego przywracania” - było to niesamowite, jeśli chodzi o uzyskiwanie lepszych komunikatów o błędach dla podstawek
izikandrw

1
Zauważyłem, że błędy w segmentach zasad spowodują, że rzeczy takie jak BucketPolicy utkną na zawsze na etapie CREATE - jeśli coś utknie w CREATE, zacznij tam.
Eric Nord,

Odpowiedzi:


46

Użyj aws cloudformation validate-templatepolecenia w narzędziu AWS CLI. Sprawdza tylko, czy Twój szablon jest prawidłowym JSON lub YAML, a nie czy twoje klucze i wartości są poprawne (na przykład nie sprawdza literówek w kluczach)


1
Jest to również dostępne w ujednoliconej cli docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/ ...
mp3foley

7
Nawiasem mówiąc, jest to aws cloudformation validate-templatew nowych narzędziach AWS CLI.
Christopher

8
Dla każdego, kto napotka to pytanie w 2017+, jest to teraz aws cloudformation validate-templatei sprawdza tylko, czy twój szablon jest prawidłowy w formacie JSON lub YAML, a nie czy twoje klucze i wartości są poprawne (na przykład nie sprawdza literówek w kluczach).
Daniel Kats

1
Z jakiegoś powodu wydaje się ignorować długość linii, np Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. Zgodnie z validate-templatepoleceniem nie był to problem, ale interfejs użytkownika zwraca ten błąd.
030

2
Jeśli to narzędzie obsługuje tylko walidację formatu pliku, nie jest; jsonlint lub yamllint wystarczy? To narzędzie ma również ograniczenie rozmiaru pliku do 51 200 bajtów.
Siva Senthil

23

Inną opcją, rok później, jest przeniesienie tych szablonów do biblioteki innej firmy, takiej jak troposfera . Ta biblioteka tworzy ładunek JSON za Ciebie i wykonuje wiele weryfikacji po drodze. To również rozwiązuje problem „Wow, zarządzanie 1000-wierszowym plikiem JSON z pewnością jest smutne” .


3
„Wow, zarządzanie 1000-wierszowym plikiem JSON, z pewnością jest smutne” - z pewnością po to utworzono stosy zagnieżdżone? ;-) Chociaż zgadzam się - Troposfera jest niesamowita!
YFP

11

Jak mogę przyspieszyć proces debugowania szablonu, czy też utknąłem na zawsze, zauważając swoje błędy pół godziny po ich popełnieniu?

Oto kilka sugestii dotyczących sprawdzonych metod, skupiających się w szczególności na poprawie szybkości iteracji tworzenia złożonych szablonów CloudFormation:

Użyj narzędzi CloudFormation do weryfikacji szablonów i aktualizacji stosów

AWS przedstawił to już w swoim własnym dokumencie z najlepszymi praktykami , więc nie będę ich powtarzał:

Celem tego kroku jest wyłapanie oczywistych błędów składniowych lub logicznych przed faktycznym utworzeniem / aktualizacją stosu.

Zasoby testowe w izolacji

Przed użyciem dowolnego zasobu CloudFormation w złożonym stosie upewnij się, że dokładnie rozumiesz pełny zakres zachowań związanych z tworzeniem / aktualizowaniem / usuwaniem tego zasobu, w tym wszelkie ograniczenia użytkowania i typowy czas uruchamiania / rozłączania, testując ich zachowanie w mniejszych, samodzielnych stosach pierwszy.

  • Jeśli tworzysz lub używasz dowolnych zasobów niestandardowych innych firm, napisz testy jednostkowe przy użyciu bibliotek odpowiednich dla platformy językowej, aby upewnić się, że logika aplikacji zachowuje się zgodnie z oczekiwaniami we wszystkich przypadkach użycia.
  • Należy pamiętać, że czas tworzenia / aktualizowania / usuwania pojedynczego zasobu może się znacznie różnić między typami zasobów, w zależności od zachowania bazowych wywołań interfejsu API. Na przykład utworzenie / zaktualizowanie / usunięcie złożonego AWS::CloudFront::Distributionzasobu może czasami zająć 30-60 minut , podczas gdy plikAWS::EC2::SecurityGroup aktualizacja w ciągu kilku sekund.
  • Poszczególne zasoby mogą mieć błędy / problemy / ograniczenia w ich implementacji, które są znacznie łatwiejsze do debugowania i opracowywania obejść, gdy są testowane w izolacji, a nie w znacznie większym stosie. Należy pamiętać o ograniczeniach, takich jak limity usług AWS, w zależności od indywidualnych ustawień konta AWS lub dostępność usług w regionie w zależności od regionu, w którym tworzysz swój stos.

Twórz skomplikowane stosy małymi krokami

Podczas tworzenia / aktualizacji stosu awaria dowolnego pojedynczego zasobu spowoduje wycofanie całego zestawu zmian w zasobach, co może niepotrzebnie zniszczyć inne pomyślnie utworzone zasoby i zająć bardzo dużo czasu podczas budowania skomplikowanego stosu z długim wykres zależności powiązanych zasobów.

Rozwiązaniem tego problemu jest stopniowe budowanie stosu w mniejszych partiach aktualizacji, dodając zasoby pojedynczo (lub kilka). W ten sposób, jeśli wystąpi awaria podczas tworzenia / aktualizacji zasobów, wycofanie nie spowoduje zniszczenia całego zasobu stosu, a jedynie zestaw zasobów zmieniony w ostatniej aktualizacji.

Monitoruj postęp aktualizacji stosu

Pamiętaj, aby monitorować postęp swojej aktualizacji stosu , przeglądając zdarzenia stosu podczas tworzenia / aktualizacji. Będzie to punkt wyjścia do debugowania dalszych problemów z poszczególnymi zasobami.


O CloudFront i jak długo to trwa, czy i tak wiesz, że stos będzie w stanie ukończonym, bez czekania, chcę uzyskać dane wyjściowe, ale nie muszę czekać na wdrożenie dystrybucji w moim przypadku
mcfedr

9

Czy spojrzałeś na edytor szablonów AWS CloudFormation, który jest zawarty w AWS Toolkit for Eclipse ? Ma podświetlanie składni, uzupełnianie instrukcji i wdrażanie w AWS CloudFormation.


7
Niezbędny był dla mnie „AWS Toolkit for Visual Studio”.
Ed Norris,

5

Spóźniony na imprezę, ale dodam też, że warto poświęcić trochę czasu na konfigurację i naukę edytora. Wiem, że brzmi to śmiesznie prosto, ale spróbuj.

W moim przypadku, z vimem, spisałem się znacznie lepiej, gdy poświęciłem trochę czasu na instalację wtyczek json, a także (w końcu) zrozumiałem techniki składania, aby łatwo poruszać się po dużych plikach CF. Mój sugeruje teraz literówki (przecinki w miejscach, w których nie powinny być itp.), A podświetlenie kolorem oszczędza dużo czasu, dając wyraźne wizualne wskazówki.

Może to pomóc złagodzić błędy składniowe, ale błędy logiczne w szablonie są lepiej naprawiane przez inne narzędzia. Miejmy nadzieję, że pewnego dnia pojawi się tryb „podglądu” w CF.


1
To wcale nie jest śmieszna sugestia. Nie jestem pewien, czy potrafię kodować bez podświetlania składni.
Christopher,

2
dostępny jest podgląd CFN, który pokazuje wszystkie zasoby, które zamierzasz utworzyć, a także informuje, ile będzie kosztował Twój stos. Używam API Java, więc nie jestem pewien, czy jest dostępny w CLI, ale spróbuj tego: link
iGili

5

AWS CloudFormation linter zapewnia dodatkowa analiza statyczna Beyondaws cloudformation validate-template

Poinformuje Cię, które typy zasobów i typy wystąpień są niedostępne w niektórych regionach, zweryfikuje wartości właściwości pod kątem dozwolonych wartości, przechwyci cykliczne zależności zasobów, błędy składniowe, limity szablonów i wiele więcej

Oprócz CLI, jednym z najpopularniejszych mechanizmów, o których należy pamiętać, aby uruchomić lintera, jest instalacja wtyczki edytora, takiej jak rozszerzenie Visual Studio Code które działa przy każdym zapisie pliku

Inne mechanizmy, takie jak przechwyty Git przed zatwierdzeniem, są opisane tutaj

Przykładowy zrzut ekranu rozszerzenia Visual Studio Code


4

W przypadku IDE JetBrains (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio) dostępna jest wtyczka AWS CloudFormation, która obsługuje głębokie sprawdzanie szablonów JSON i YAML CFN


2

Jeśli masz do czynienia z maszynami EC2, polecam zalogować się do maszyny EC2 i ustawić plik boot.log (/var/log/boot.log w RHEL6 / Centos). Ten plik jest aktualizowany o wszystkie działania powłoki (czynności takie jak: instalacja, pobieranie plików, kopiowanie plików itp.).

Skorzystaj również z edytorów, takich jak http://www.jsoneditoronline.org/, aby uzyskać reprezentację TREE swojego kodu JSON. Pomaga to sprawdzić kolejność elementów JSON.

A kiedy aktualizujesz pliki, zawsze używaj narzędzi takich jak http://www.git-tower.com/blog/diff-tools-mac/ lub rzeczywistego systemu kontroli wersji, aby upewnić się, że przypadkowo nie zmienisz czegoś, co mogłoby zepsuć twój skrypt.



1

Niedawną nową funkcją dodaną do Cloudformation w grudniu ubiegłego roku było dodanie dodatkowych typów parametrów . Te nowe typy umożliwiają Twoim szablonom skuteczniejsze sprawdzanie danych, a także mogą „działać szybko” podczas tworzenia zasobów i zagnieżdżonych stosów Cloudformation. Masz również możliwość dostarczania bardziej czytelnych dla człowieka niestandardowych komunikatów o błędach, gdy nieprawidłowe wartości są przekazywane za pomocą nowego atrybutu ConstraintDescription .

Nowe typy są szczególnie przydatne w przypadku różnych zasobów VPC. Możesz upewnić się, że parametry dla twoich szablonów są poprawnego typu i wyraźnie mówią o oczekiwaniu pojedynczej wartości w porównaniu z listą.

Na przykład:

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.