Czy istnieje sposób zdefiniowania skrótów do często używanych wartości pochodzących z parametrów szablonu CloudFormation?
Na przykład - mam skrypt, który tworzy stos projektu Multi-AZ o nazwie ELB project
i dwóch instancjach za ELB o nazwie project-1
i project-2
. Przekazuję ELBHostName
parametr tylko do szablonu, a później wykorzystuję go do skonstruowania:
"Fn::Join": [
".", [
{ "Fn::Join": [ "", [ { "Ref": "ELBHostName" }, "-1" ] ] },
{ "Ref": "EnvironmentVersioned" },
{ "Ref": "HostedZone" }
]
]
Ta konstrukcja lub bardzo podobna jest powtarzana wiele razy w całym szablonie - w celu utworzenia nazwy hosta EC2, rekordów Route53 itp.
Zamiast powtarzać to w kółko, chciałbym przypisać wynik tego Fn::Join
do jakiejś zmiennej i odwoływać się do tego, tak jak mogę z "Ref":
instrukcją.
Idealnie coś takiego:
Var::HostNameFull = "Fn::Join": [ ... ]
...
{ "Name": { "Ref": "Var::HostNameFull" } }
lub coś podobnego prostego.
Czy to możliwe dzięki Amazon CloudFormation?
Odpowiedzi:
Szukałem tej samej funkcjonalności. Przyszło mi na myśl użycie zagnieżdżonego stosu, jak sugerował SpoonMeiser, ale potem zdałem sobie sprawę, że tak naprawdę potrzebowałem funkcji niestandardowych. Na szczęście CloudFormation pozwala na użycie AWS :: CloudFormation :: CustomResource, który przy odrobinie pracy pozwala to zrobić. To wydaje się przesadne w przypadku samych zmiennych (coś, co argumentowałbym, że powinno być w CloudFormation w pierwszej kolejności), ale wykonuje zadanie, a ponadto pozwala na całą elastyczność (wybierz Python / node) /Jawa). Należy zauważyć, że funkcje lambda kosztują pieniądze, ale mówimy tutaj o pensach, chyba że utworzysz / usuniesz swoje stosy wiele razy na godzinę.
Pierwszym krokiem jest utworzenie funkcji lambda na tej stronie , która nie robi nic poza pobraniem wartości wejściowej i skopiowaniem jej na wyjście. Moglibyśmy sprawić, aby funkcja lambda robiła różne szalone rzeczy, ale kiedy już mamy funkcję tożsamości, wszystko inne jest łatwe. Alternatywnie możemy stworzyć funkcję lambda w samym stosie. Ponieważ używam wielu stosów na jednym koncie, miałbym całą resztę funkcji i ról lambda (i wszystkie stosy muszą zostać utworzone za pomocą
--capabilities=CAPABILITY_IAM
, ponieważ również potrzebuje roli.Utwórz funkcję lambda
index.handler
Następnie skopiuj i wklej poniższy kod w polu kodu. Na górze tej funkcji znajduje się kod z modułu python-odpowiedź cfn , który jest instalowany automatycznie tylko wtedy, gdy funkcja lambda została utworzona za pomocą CloudFormation, z jakiegoś dziwnego powodu. Ta
handler
funkcja jest dość oczywista.Możesz teraz przetestować funkcję lambda, wybierając przycisk „Test”, a następnie „Próbka tworzenia CloudFormation” jako przykładowy szablon. Powinieneś zobaczyć w swoim dzienniku, że zmienne wprowadzone do niego są zwracane.
Użyj zmiennej w szablonie CloudFormation
Teraz, gdy mamy tę funkcję lambda, możemy jej używać w szablonach CloudFormation. Najpierw zanotuj funkcję lambda Arn (przejdź do strony głównej lambda , kliknij właśnie utworzoną funkcję, Arn powinien być w prawym górnym rogu, coś w stylu
arn:aws:lambda:region:12345:function:CloudFormationIdentity
).Teraz w swoim szablonie, w sekcji zasobów, podaj swoje zmienne, takie jak:
Najpierw określam
Identity
zmienną zawierającą Arn dla funkcji lambda. Umieszczenie tego w zmiennej tutaj oznacza, że muszę to określić tylko raz. Robię wszystkie moje zmienne typuCustom::Variable
. CloudFormation pozwala na użycie dowolnej nazwy typu zaczynającej się naCustom::
dla niestandardowych zasobów.Zauważ, że
Identity
zmienna zawiera dwa razy Arn dla funkcji lambda. Raz, aby określić funkcję lambda do użycia. Drugi raz jako wartość zmiennej.Teraz, gdy mam
Identity
zmienną, mogę definiować nowe zmienne za pomocąServiceToken: !GetAtt [Identity, Arn]
(myślę, że kod JSON powinien być podobny"ServiceToken": {"Fn::GetAtt": ["Identity", "Arn"]}
). Tworzę 2 nowe zmienne, każda z 2 polami: Nazwa i Arn. Z pozostałej części mojego szablonu mogę korzystać!GetAtt [ClientBucketVar, Name]
lub!GetAtt [ClientBucketVar, Arn]
kiedykolwiek będę go potrzebować.Słowo ostrzeżenia
Podczas pracy z niestandardowymi zasobami, jeśli funkcja lambda ulegnie awarii, utkniesz na 1 do 2 godzin, ponieważ CloudFormation czeka godzinę na odpowiedź z (zawieszonej) funkcji przed poddaniem się. Dlatego dobrze jest określić krótki limit czasu dla stosu podczas rozwijania funkcji lambda.
źródło
cloudformation-tool
klejnotu), więc pakuję kreację lambda do szablon, a następnie można go użyć bezpośrednio zamiast tworzyćIdentity
niestandardowy zasób. Zobacz tutaj mój kod: gist.github.com/guss77/2471e8789a644cac96992c4102936fb3Nie mam odpowiedzi, ale chciałem zauważyć, że możesz zaoszczędzić sobie dużo bólu, używając
Fn::Sub
zamiastFn::Join
Zastępuje
źródło
Nie. Próbowałem, ale wyszedłem pusty. Dla mnie sensowne było utworzenie wpisu Mappings o nazwie „CustomVariables” i posiadanie w nim wszystkich moich zmiennych. Działa dla prostych ciągów, ale nie można używać Intrinsics (Refs, Fn :: Joins itp.) Wewnątrz Mappings .
Pracuje:
Nie będzie działać:
To tylko przykład. Nie umieściłbyś samodzielnego Ref w zmiennej.
źródło
Możesz użyć zagnieżdżonego stosu, który rozpoznaje wszystkie zmienne w wynikach, a następnie użyć
Fn::GetAtt
do odczytania wyników z tego stosuźródło
Możesz użyć zagnieżdżonych szablonów, w których „rozwiązujesz” wszystkie zmienne w zewnętrznym szablonie i przekazujesz je do innego szablonu.
źródło